为什么对 std::map::operator[] 的调用不针对没有默认构造函数的值类型进行编译?

Why doesn't a call to std::map::operator[] compile for a value type without default constructor?

考虑以下 class MyStruct:

struct MyStruct
{
    int x;
    int y;

    MyStruct(int i, int j):
    x(i), y(j)
    {
    }
};

请注意 MyStruct 没有默认析构函数。

下面代码中的赋值 m["AAAA"] = MyStruct(1, 1) 无法编译:

int main(int, char**)
{
    map<string, MyStruct> m;
    m["AAAA"] = MyStruct(1, 1);

    return 0;
}

为什么我需要 MyStruct 的默认构造函数?为什么上面的代码不能编译?

Why I need default constructor?

您可以按以下方式使用 std::map<std::string, MyStruct> 对象 m 的下标运算符(即 []):

auto value = m["AAAA"];

如果 std::map<std::string, MyStruct> 没有与键 "AAAA" 关联的 MyStruct 对象,则容器将创建一个默认构造的对象并将其关联到键 "AAAA"。因此,如果 MyStruct 没有默认构造函数,那么对 operator[] 的调用将不会编译。

从技术上讲,下面的语句是做什么的:

m["AAAA"] = MyStruct(1, 1); 

是 return 一个 lvalue (MyStruct&) 是容器 m 关联到的 MyStruct 对象键 "AAAA"。如果没有这样的关联,容器会为这个关联创建一个 default-constructed MyStruct 对象。最后,这个 returned 对象是赋值运算符的目标。