【问题标题】:Why doesn't a call to std::map::operator[] compile for a value type without default constructor? [duplicate]为什么对 std::map::operator[] 的调用不能编译为没有默认构造函数的值类型? [复制]
【发布时间】:2020-12-11 01:54:24
【问题描述】:

考虑以下类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;
}

为什么我需要MyStruct 的默认构造函数?为什么上面的代码无法编译?

【问题讨论】:

  • 编译器会为你生成一个。就像 Java。
  • 您认为m["AAAA"] 会做什么?你的教科书或documentation 是怎么说的?你明白为什么它需要一个默认构造函数了吗?你明白为什么你的类型没有一个吗?
  • 为什么不在你的问题中包含编译错误信息?
  • @BaileyKocin OP 已经定义了构造函数MyStruct(int i, int j),所以默认构造函数是not默认创建的。这也是 OP 观察到的,并在询问为什么所示示例需要默认值。

标签: c++ stl stdmap


【解决方案1】:

为什么我需要默认构造函数?

您可以通过以下方式使用std::map&lt;std::string, MyStruct&gt; 对象m 的下标运算符(即[]):

auto value = m["AAAA"];

如果std::map&lt;std::string, MyStruct&gt; 没有与键"AAAA" 关联的MyStruct 对象,则容器将创建一个默认构造对象并将其与键"AAAA" 关联。因此,如果MyStruct 没有默认构造函数,则对operator[] 的调用将无法编译。

从技术上讲,以下语句的作用:

m["AAAA"] = MyStruct(1, 1); 

是将一个左值 (MyStruct&amp;) 返回到容器m 与键"AAAA" 关联的MyStruct 对象。如果没有这样的关联,容器会为此关联创建一个默认构造的MyStruct 对象。最后,这个返回的对象就是赋值运算符的目标。

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2020-05-31
    相关资源
    最近更新 更多