C++11 初始化地图

C++11 initialize map

本文关键字:地图 初始化 C++11      更新时间:2023-10-16

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