如何解决为什么没有默认构造函数的对std :: map :: operator []的调用不能编译为值类型?
请考虑以下课程.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"
对象。最后,此返回的对象是赋值运算符的目标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。