问题描述
请考虑以下课程.expander a {
text-decoration: none;
}
.expander a:hover {
text-decoration: none;
}
:
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;
}
的默认构造函数?为什么上面的代码无法编译?
解决方法
为什么需要默认构造函数?
您可以通过以下方式使用[]
对象std::map<std::string,MyStruct>
的下标运算符(即m
):
auto value = m["AAAA"];
如果std::map<std::string,MyStruct>
没有与键MyStruct
关联的"AAAA"
对象,则容器将创建一个默认构造的对象并将其与键{{1}相关联}。因此,如果"AAAA"
没有默认构造函数,则对MyStruct
的调用将不会编译。
从技术上讲,下面的语句是做什么的:
operator[]
是将左值(m["AAAA"] = MyStruct(1,1);
)返回到容器MyStruct&
与键MyStruct
关联的m
对象。如果没有这样的关联,则容器会为此关联创建一个默认构造的"AAAA"
对象。最后,此返回的对象是赋值运算符的目标。