C++11 初始化地图
C++11 initialize map
我正在尝试使用 C++11 语法初始化 STL 映射,但这似乎不起作用。初始化后,当我尝试访问该元素时,它会尝试调用 Foo 的私有构造函数。我错过了什么吗?如果我使用,它可以工作。我想知道我是否可以使用 operator[] 来访问初始化的值......
#include <map>
#include <string>
class Foo{
public:
int a, b;
Foo(int a_, int b_){
a = a_;
b = b_;
}
private:
Foo(){};
};
int main(){
std::map<std::string, Foo> myMap = { {"1", Foo(10,5)}, {"2", Foo(5,10)} };
int b = myMap["1"].b; // it tries to call private constructor of Foo.
return 0;
}
在地图上使用 operator[]
时,可以使用运算符从映射中获取值或将值分配到映射中。为了将值分配到映射中,映射必须构造其值类型的对象,并通过引用返回它,以便您可以使用operator=
覆盖现有对象。
因此,该类型必须是默认可构造的,以便可以创建一个新对象供您赋值。
在运行时,如果键已存在,则不会调用构造函数,但编译器无法知道您是否会使用 operator[]
来访问不存在的值,因此它要求构造函数是公共的。
map operator[]
要求该类型是默认可构造的,因为如果不存在,它会创建一个新条目。
您可以改用at()
,如果条目不存在,则会引发:
int b = myMap.at("1").b;
相关文章:
- 如何使用 clang 格式格式化地图初始化?
- 如何使用迭代器初始化地图的键字段?
- 将空初始化器列表分配给现有向量或地图的效果
- 您应该如何在OpenGL 4.5中初始化立方体地图阵列
- 我将如何初始化C 中的一系列地图
- 使用聚合初始化时,是否可以将无拷贝置换到地图中
- 大型地图的静态初始化
- 单独的地图声明和初始化
- 有没有办法检查地图是否已在 C++98 中初始化
- 初始化地图时出错
- 初始化静态地图,不知道密钥
- 优化地图上的初始化:转发密钥
- 在 C++ 中预初始化地图
- C++地图反演初始化
- C++11 初始化地图
- 初始化 1000 个地图元素
- 在VS 2013中使用初始值设定项列表初始化地图的地图
- C++地图<K,T>初始化
- 初始化地图<字符串、矢量<string>>
- 二维静态地图的初始化