0

我有A级

struct A
{
    A() = delete;
    A(const A&) = default;
    A& operator=(const A&) = default;
    A(A&&) = default;
    A& operator=(A&&) = default;

    explicit A(int i) ....
    // a few explicit constructors
}

当我试图获取存储在 unordered_map 中的 strcut A 时,如下所示:

auto a = my_map[key_];

我明白了

非法使用删除方法

错误。我的理解是这是一个复制构造,但我不知道为什么编译器在赋值之前调用默认构造函数。

4

1 回答 1

5

来自http://en.cppreference.com/w/cpp/container/map/operator_at

mapped_type 必须满足 CopyConstructible 和 DefaultConstructible 的要求。

由于删除了默认构造函数,因此编译器正确地报告了错误。

在链接页面的下方:

返回值

如果不存在具有键 key 的元素,则引用新元素的映射值。否则引用其键等效于键的现有元素的映射值。

如果不存在具有给定键的元素,则该函数插入一个新元素。需要一个默认构造函数才能插入一个新元素。

于 2018-03-14T19:30:52.670 回答