13

我正在尝试使用 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;
}
4

2 回答 2

22

operator[]地图上使用 时,您可以使用运算符从地图中获取值或将值分配到地图中。为了将值分配到映射中,映射必须构造其值类型的对象,并通过引用返回它,以便您可以使用operator=覆盖现有对象。

因此,该类型必须是默认可构造的,以便可以创建一个新对象供您分配。

在运行时,如果键已经存在,则不会调用构造函数,但是编译器无法知道您是否会使用operator[]来访问不存在的值,因此它要求构造函数是公共的。

于 2012-06-07T22:58:52.457 回答
19

operator[]of map 要求类型是默认可构造的,因为如果不存在,它会创建一个新条目。

您可以at()改用,如果条目不存在则抛出:

int b  = myMap.at("1").b;
于 2012-06-07T22:56:57.057 回答