Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';调用std::map::operator[]编译一个没有默认构造函数的值类型?_C++_Stl_Stdmap - Fatal编程技术网

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观察到的,并且询问,为什么所示示例需要默认值。