首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有initializer_list和size的std::unordered_map构造函数在main中编译,但不在类定义中编译

带有initializer_list和size的std::unordered_map构造函数是C++标准库中的一个特性,用于创建一个无序映射容器。它的构造函数可以接受一个initializer_list作为参数,用于初始化容器中的键值对,同时也可以指定容器的初始大小。

在main函数中编译这个构造函数意味着在程序的入口点处使用了这个构造函数来创建std::unordered_map对象。然而,在类定义中编译指的是在类的声明或定义中使用了这个构造函数。

由于问题描述中没有提到具体的类定义,我假设你想在一个类的成员函数或成员变量中使用这个构造函数。在这种情况下,你需要确保你的类声明或定义中包含了std::unordered_map的头文件,并且在类的成员函数或成员变量中正确地使用了这个构造函数。

下面是一个示例代码,展示了如何在类定义中使用带有initializer_list和size的std::unordered_map构造函数:

代码语言:txt
复制
#include <unordered_map>
#include <initializer_list>

class MyClass {
public:
    MyClass() {
        std::unordered_map<int, std::string> myMap = { {1, "one"}, {2, "two"}, {3, "three"} };
        // 使用带有initializer_list和size的构造函数初始化myMap
        // 这里的initializer_list包含了三个键值对,size为3
        // 可以在构造函数中指定更大的size来提前分配容器的内存空间
    }
};

在上面的示例中,MyClass类的构造函数使用了带有initializer_list和size的std::unordered_map构造函数来初始化一个名为myMap的无序映射容器。initializer_list包含了三个键值对,size为3。

对于这个问题,由于没有提供更多的上下文信息,我无法给出更具体的答案。如果你能提供更多的代码或问题背景,我将能够给出更详细和全面的答案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11『基础新特性』

所以对于诸如 vector 这种自定义类型来说,需要把 列表初始化 视作一个类型,然后重载对这个类型参数构造函数就行了,于是 initializer_list 就诞生了,这是一个模板,大概长这样... 对象来初始化,initializer_list 这个构成十分简单,其成员函数仅有 size()、begin() end(),也就是支持迭代器遍历其中数据 细节:initializer_list... 构造函数就好了,比如这样 重载了 initializer_list 构造函数 ---- 位于 vector (自己模拟实现) // 供列表初始化调用 vector(const...直接告诉编译器:std::initializer_list::iterator 就是一个类型,并且 it 就是一个新建变量,此时就不会报错了 重载了 initializer_list 构造函数...C++98 中就已经存在了,主要用来 表明变量是局部自动存储类型,如今局部域中定义局部变量默认就是自动存储类型,因此原来 auto 显得很没用 组委会在 C++11 废弃原来用法,对 auto

22140

真没想到nullptrNULL得区别,大了去了

,所有使用大括号来完成对象默认构造没有问题 //大括号解决第三问题:构造函数形参 具备 std::initializer_list型别 //1, 如果没有以上型别,() {} 没有区别 class...复制构造函数 // WidgetBB w6{w444};//大括号,调用带有 std::initializer_list型别形参构造函数,w4返回值被强制转成成 float,随后 float又被强制转成了...//如果的确想调用一个带有 std::initializer_list 型别形参构造函数,并传入一个空 std::initializer_list的话 //可以通过把空大括号对作为构造函数实参方式实现这个目的...// 构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std: : initializer_ list 型别的形参相匹配,即使其他重载版本有着貌似更 加匹配形参表 。...没有定义 }; //C++11 delete将复制构造函数复制赋值运算符标识为删除函数 //C++11 delete将复制构造函数复制赋值运算符标识为删除函数 template<class charT

1.7K30

C++11特性大杂烩

因为这个迭代器类型由一个模板来定义该类模板未被实例化之前编译器是无法识别这个类型最好也增加一个用initializer_list为参数赋值运算符重载函数,来支持对列表对象进行赋值。...(老旧编译器会进行两次拷贝构造),针对内置类型消耗还算小,针对自定义类型或者容器参数比如vector >>这种,消耗非常大,不推荐这样用。...表达式底层这里写了一个内含仿函数成员main函数里实现了两个与Rate仿函数成员相同作用lambda表达式,分别是r2r3。...实际上底层编译器对于lambda表达式处理方式完全是按照函数对象(仿函数)处理,定义了一个lambda表达式,编译器会自动生成一个,该类重载了operator()图片可变参数模板C++98/03...(部分场景提高效率)包装后明确了可调用对象返回值参数类型,更加方便使用。bindstd::bind函数定义头文件,是一个函数模板,它就像一个函数包装器(适配器)。

88550

C++11简单介绍(上)

一般是作为构造函数参数,C++11对STL不少容器就增加std::initializer_list作为参数构造函数,这样初始化容器对象就更方便了。...其实,移动构造还进行了一次拷贝构造,只是C++11将一次移动构造一次拷贝构造直接优化成了一次移动构造 STL容器都是增加了移动构造移动赋值: http://www.cplusplus.com...原来C++,有6个默认成员函数构造函数 析构函数 拷贝构造函数 拷贝赋值重载 取地址重载 const 取地址重载 默认成员函数就是我们不写编译器会生成一个默认。...例如: 下面代码person我们没有实现它移动构造,析构函数,拷贝构造拷贝赋值任意一个age是内置类型,name是自定义类型,string我们实现了移动构造,所以会调用string移动构造...C++11更简单,只需函数声明加上=delete即可,该语法指示编译器不生成对应函数默认版本,称=delete修饰函数为删除函数

9110

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

}; Vector v2; v2 = { 1,2,3,4,5 }; return 0; } 效果: 注:initializer_list是系统自定义模板,该类模板主要有三个方法...C++对于空编译器会生成一些默认成员函数,如果在显式定义了,编译器将不会重新生成默认版本 有时候这样规则可能被忘记,最常见是声明了带参数构造函数,必要时则需要定义不带参数版本以实例化无参对象...而且有时编译器会生成,有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成 显式缺省函数 C++11,可以默认函数定义或者声明时加上=default,从而显式指示编译器生成该函数默认版本...; // 声明,定义时让编译器生成默认赋值运算符重载 A& operator=(const A& a); private: int _a; }; A& A::operator=(const...98,是该函数设置成private,并且不给定义,这样只要其他人想要调用就会报错 C++11更简单,只需函数声明加上=delete即可,该语法指示编译器不生成对应函数默认版本,称=delete

70060

【重学 C++】06 | C++该不该使用 explicit

文章首发【重学 C++】06 | C++该不该使用 explicit引言大家好,我是只讲技术干货会玩code,今天是【重学C++】第六讲, C++,explicit关键字作用于构造函数或类型转换操作符...隐式转换合理使用场景拷贝构造函数移动构造函数对于拷贝构造函数移动构造函数,我们通常希望它们能够需要时自动调用,以便进行对象拷贝移动操作。...所以会编译失败。单入参std::initializer_list构造函数std::initializer_list 是 C++11 引入一种特殊类型,用于简化初始化对象时传递初始化列表过程。...拷贝构造函数移动构造函数,不推荐使用 explicit,以便编译器可以自动调用这些构造函数。...对于带有单入参std::initializer_list构造函数,也不推荐使用explicit,以方便使用初始化列表语法进行隐式转换。同类型扩展,为了避免差异化,隐式转换会更合适。

21200

《Effective Modren C++》 进阶学习(上)

另外,构造函数有参数情况,若不包含std::initializer_list参数或者 构造未传入实参,(){}产生一样效果,否则{}优先匹配std::initializer_list参数构造函数...编译错误!要求变窄转换 只有当传入参数在编译器上无法转换成std::initializer_listT类型,才会匹配普通构造函数。...构造重载匹配,只要参数能够强转std::initializer_listT,就会匹配std::initializer_list构造函数,即便有更加匹配构造函数。...C++11实现一个空编译器会自动声明六个函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。  ...使用override声明重写函数 C++中子类可以重写基函数两者必须完全相同,才会被编译器认定为是重写函数; 否则会被认定为子类自身函数成员,且编译器不会提醒。

17320

深入解析C++auto自动类型推导

于是C++标准委员会在C++11标准改变了auto关键字语义,使它变成一个类型占位符,允许定义变量时不必明确写出确切类型,让编译器在编译期间根据初始值自动推导出它类型。...x2定义将会引起编译错误,因为x2虽然推导为initializer_list类型,但是推导T类型时,里面的元素类型不统一,导致无法推导出T类型,引起编译错误。...expr是数组或者函数 数组某些情况会退化成一个指向数组首元素指针,其实数组类型指针类型并不相同,如下定义: const char name[] = "My Name"; const char...跨平台可移植性 假如你代码定义了一个vector,然后想要获取vector元素大小,这时你调用了成员函数size来获取,此时应该定义一个什么类型变量来承接它返回值?...内初始化成员时不能使用auto C++11标准已经支持了内初始化数据成员,也就是说定义时,可以直接在内声明数据成员地方直接写上它们初始值,但是在这个情况下不能使用auto来声明非静态数据成员

16120

c++17好用新特性总结

前言 从C++11开始,标志着c++复兴和现代C++开端。尽管有各种新语言层出不穷,涉及性能系统层面c++仍然是首选,地位无可撼动。...这是因为 当用于auto声明变量表达式是{}括起来,推导型别就会变成 std::initializer_listC++17,对auto表达式推导规则进行了改变。...C++17之前,我们定义全局变量, 总需要将变量定义cpp文件,然后通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。...inline变量出现后,我们可以直接将全局变量定义头文件,而不用担心出现redefine错误信息。...::map/unordered_map try_emplace  std::map/unordered_map插入元素时,我们往往使用emplace,emplace操作是如果元素key不存在,则插入该元素

3.1K10

什么?CC++面试过不了?因为你还没看过这个!

递归、switch 等复杂操作内联函数声明定义函数,除了虚函数其他函数都会自动隐式地当成内联函数。...内联函数相比宏函数来说,代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 声明同时定义成员函数,自动转化为内联函数,因此内联函数可以访问成员变量,宏定义则不能。...如: using namespace_name::name; 构造函数 using 声明 C++11 ,派生能够重用其直接基定义构造函数。...,因为使用初始化列表可以不必调用默认构造函数来初始化 initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list...因此, default copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 构造函数

3.6K50

C语言与C++面试知识总结

、递归、switch 等复杂操作内联函数声明定义函数,除了虚函数其他函数都会自动隐式地当成内联函数。...内联函数相比宏函数来说,代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 声明同时定义成员函数,自动转化为内联函数,因此内联函数可以访问成员变量,宏定义则不能。...如: using namespace_name::name; 构造函数 using 声明 C++11 ,派生能够重用其直接基定义构造函数。...,因为使用初始化列表可以不必调用默认构造函数来初始化 initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list...因此, default copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 构造函数

4.9K41

【C++】C++11常见语法(上)

std::initializer_list 介绍文档:std::initializer_list 我们先来看看 std::initializer_list 是什么类型: int main()...结合下图理解: STL容器C++11以后,都增加了移动构造移动赋值,如下图: 4. 右值引用引用左值及其一些更深入使用场景分析 按照语法,右值引用只能引用右值,右值引用一定不能引用左值吗?...,自定义深拷贝传值返回影响也较大,因为移动构造移动赋值出来以后减少了它们深拷贝;一些容器插入接口也新增了右值版本,也减少了深拷贝。...成员变量初始化 C++11允许定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化,这个我们对象已经介绍过了,这里就不再细讲了。 3.... C++11 更简单,只需函数声明加上 =delete 即可,该语法指示编译器不生成对应函数默认版本,称 =delete 修饰函数为删除函数

14710

初始化|这些年踩过

模板函数create,使用统一初始化并返回,对于a来说,因为其传入std::string,那么函数create,将变成**return std::vector{10...编译器有个特点,对于以花括号初始化方式则认为是统一初始化,如果构造函数同样存在std::initializer_list为参数构造函数,那么则优先调用: class MyClass { public...{ MyClass obj{5, 1.0}; }; 我们可能期望MyClass obj{5, 1.0};调用第一个构造函数(以intdouble作为参数构造函数),但由于存在以std::initializer_list...试想一下,如果不涉及缩小转换(例如,第二个构造函数接受 in std::initializer_list,则代码将使用第二个构造函数初始值设定项列表int 5转换为double 5.0...)默默执行,而开发人员则认为它正在使用第一个构造函数,emm,后果不堪设想~~ 在上面提了,编译器会优先调用参数为std::initializer_list构造函数,但是有个例外: class MyClass

17310

Modern c++快速浅析

::vector::size_typestd::unordered_map键值对例如std::pair•但是过量使用auto会导致代码可读性降低...因为UserInfoFields底层是std::size_t,所以这个模板函数将会返回std::size_t类型值 enum class UserInfoFields : std::size_t {...泛用性每代C++中都得到了提高 C++11,constexpr可以用来修饰对象(包括内置类型定义类型),以及可以用来修饰函数构造函数,成员函数,普通函数等等),如果以constexpr修饰构造函数...,那么代表构造出来对象可以是一个编译期常量 以修饰函数为例,函数是否返回值是否满足constexpr取决于两个方面 •传入参数是否是编译期常量•函数体内计算是否是编译期能够处理 当两者条件都能满足时...那么我们可以认为这个Lambda所生成匿名,含有一个char类型一个指针类型(this指针),由于内存对齐缘故,这个Lambda类型大小是8个字节 // 假设这是编译器生成匿名 class

16010

Chapter 3: Moving to Modern C++

::initializer_list参数,使用花括号初始化时,编译器会强烈地偏向于调用使用std::initializer_list参数重载构造函数 class Widget { public...construction 编译器非常偏向选择std::initializer_list构造函数,以至于即便最匹配std::initializer_list构造函数不能被调用,编译器也会优先选择它...只有当没有办法花括号初始化参数类型std::initializer_list参数类型之间进行转换时,编译器才会重新选择正常构造函数 class Widget { public:...std::initializer_list构造函数时,此时调用空花括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在花括号嵌套一个空花括号进行初始化...字面值类型包括除了void修饰类型带有constexpr修饰用户自定义类型(因为构造函数其他成员函数也可能是constexpr) class Point { public:

1.8K60

C++11知识点总结(全面解析C++11经常考到知识点)

多个对象列表初始化 多个对象想要支持列表初始化,需给该类(模板)添加一个带有initializer_list类型参数构造函数即可。...注意:initializer_list是系统自定义模板,该类模板主要有三个方法:begin()、end()迭代器以及获取区间中元素个数方法size()。...默认成员函数控制 C++对于空编译器会生成一些默认成员函数,比如:构造函数、拷贝构造函数、运算符重载、析构函数&const&重载、移动构造、移动拷贝构造函数。...如果在显式定义了,编译器将不会重新生成默认版本。有时候这样规则可能被忘记,最常见是声明了带参数构造函数,必要时则需要定义不带参数版本以实例化无参对象。...C++11编译器会为默认生成一个移动构造,该移动构造为浅拷贝,因此当涉及到资源管理时,用户必须显式定义自己移动构造

2K10

【C++】C++11 新特性

; 当列表元素个数不符合构造函数参数要求时,会先将列表转换为 initializer_list ,然后再调用参数为 initializer_list 构造函数完成初始化。...initializer_list 构造 (注:容器适配器重载了移动构造没有重载initializer_list构造): 所有容器赋值重载函数都重载了移动赋值参数为 initializer_list...注意: lambda 函数定义,参数列表返回值类型都是可选部分,即可以省略不写,同时捕捉列表函数体也可以为空,因此 C++11 中最简单 lambda 函数为:[]{}; 该 lambda... C++11 标准引入了 std::function 模板,其定义 头文件。...,并且也不需要我们 function 参数包显式声明;这样我们就可以通过绑定让我们将普通成员函数静态成员函数以及 lambda 表达式、函数指针一样定义为统一类型了;如下: 需要说明

1.3K10

【C++】C++11常用特性总结

列表C++作用于对象时,同样也可以初始化对象。当然,{}列表初始化对象时候会调用对象所属构造函数。...,因为他们其实各自有一块空间用来存储右值,rr2是不能被修改,因为rr2引用时带有const属性。...C++98默认成员函数有六个,C++11新增了两个默认成员函数,分别为移动构造移动赋值。...由于构造函数对内置类型不处理,所以C++11成员变量打了补丁,即允许定义时候,给成员变量缺省值,这个缺省值会在构造函数初始化列表使用,进行成员变量初始化。...C++98,可以采用方式就是拷贝构造函数设置为私有,这样外面如果有人想要进行对象拷贝,他肯定是调不到拷贝构造函数,这样解决方式可以防止外面进行对象拷贝。

77840

《Effective Modern C++》读书笔记

,这不是所期望; 当多个构造函数里,有一个是用std::initializer_list时,要注意其他构造函数不能用{}语法; 当有类型转换函数时,第二个缺点会变得更严重:复制构造函数可能不会被调用...(一种例外情况是当{...}里元素不能被转换成std::initializer_listT时,编译器才会转而使用其他构造函数); 编写构造函数最佳实践 当你要给自定义加上std::initializer_list...、mf2、mf3这3个覆盖函数无法编译通过,因为编译Base找不到对应函数。...c++11,有非成员函数beginend,没有非成员函数cbegincend(c++14才有)。...modern c++,用户定义析构函数亦或是编译器生成析构函数,都隐式声明了noexcept。

1.8K20

STL中有哪些副作用或稍不注意会产生性能开销地方?

STL稍不注意会产生性能开销地方 STL容器clear时间复杂度不是O(1) 可能很多人都不在意,使用STL容器时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)。...比如在后台服务,有些容器类型变量命中某些条件下要进行clear(),后续逻辑判断容器是空,就不在用之进行某些逻辑(比如遍历它,进行某种操作)。...但是大家可能会忽略,当你定义类型没有移动构造函数时候,调用是拷贝构造函数!当然如果你类型,比较简单(比如只是保护2个基本数据类型)那么拷贝构造开销也不大。...如果你定义类型比较复杂时候,拷贝构造开销显然大于移动构造函数。...所以当你最好给你定义对象添加一个移动构造函数,另外为了使sort()能够成功通过编译定义完移动构造函数以后,还要再定义一个移动赋值函数

1.2K10
领券