为什么没有默认构造函数的对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"对象。最后,此返回的对象是赋值运算符的目标。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...