我正在尝试使用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;
}
答案 0 :(得分:22)
在地图上使用operator[]
时,您可以使用运算符从地图中获取值或将值指定给地图。为了将值分配给地图,地图必须构造其值类型的对象,并通过引用返回它,以便您可以使用operator=
覆盖现有对象。
因此,类型必须是默认可构造的,以便可以创建一个新对象供您分配。
在运行时,如果密钥已经存在,则不会调用构造函数,但编译器无法知道您是否曾使用operator[]
来访问不存在的值,因此它要求构造函数是公开的。
答案 1 :(得分:19)
operator[]
要求类型是默认可构造的,因为如果不存在,它会创建一个新条目。
您可以使用at()
代替,如果条目不存在则会抛出:
int b = myMap.at("1").b;