为什么对 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 对象是赋值运算符的目标。
考虑以下 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 对象是赋值运算符的目标。