C++ 为什么';调用std::map::operator[]编译一个没有默认构造函数的值类型?
考虑以下类C++ 为什么';调用std::map::operator[]编译一个没有默认构造函数的值类型?,c++,stl,stdmap,C++,Stl,Stdmap,考虑以下类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&qu
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;
}
int main(int,char**)
{
地图m;
m[“AAAA”]=MyStruct(1,1);
返回0;
}
为什么我需要MyStruct
的默认构造函数?为什么上面的代码不能编译
为什么我需要默认构造函数
您可以按以下方式使用std::map
对象m
的下标运算符(即[]
):
auto value = m["AAAA"];
如果std::map
没有与键“AAAA”
关联的MyStruct
对象,则容器将创建一个默认构造的对象,并将其与键“AAAA”
关联。因此,如果MyStruct
没有默认构造函数,那么对操作符[]
的调用将不会编译
从技术上讲,以下陈述的作用是:
m["AAAA"] = MyStruct(1, 1);
是将左值(
MyStruct&
)返回到容器m
与键关联的MyStruct
对象。如果没有这样的关联,容器将为此关联创建一个默认构造的MyStruct
对象。最后,这个返回的对象是赋值运算符的目标。编译器会为您生成一个对象。就像Java一样。你认为m[“AAAA”]
有什么作用?你的课本或老师说它是做什么的?你明白为什么它需要一个默认构造函数了吗?你知道为什么你的类型没有编译错误消息吗?为什么不在你的问题中包含编译错误消息?@BaileyKocin OP已经定义了构造函数MyStruct(int i,int j)
,因此默认情况下不会创建默认构造函数。这也是OP观察到的,并且询问,为什么所示示例需要默认值。