C++ 非法使用已删除的函数
我有一个甲级C++ 非法使用已删除的函数,c++,c++11,c++14,deleted-functions,C++,C++11,C++14,Deleted Functions,我有一个甲级 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
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
}
当我试图获取存储在无序图中的struct A时,如下所示:
auto a = my_map[key_];
我明白了
非法使用已删除的方法
错误。
我的理解是这是一个复制构造,但我不知道为什么编译器在赋值之前调用默认构造函数。来自:
映射的类型必须满足CopyConstructible和DefaultConstructible的要求
由于默认构造函数被删除,编译器会正确地报告错误
在链接页面的下方:
返回值
如果不存在具有键的元素,则引用新元素的映射值。否则,将引用其键等效于键的现有元素的映射值
如果不存在具有给定键的元素,则函数将插入新元素。需要默认构造函数才能插入新元素。来自:
映射的类型必须满足CopyConstructible和DefaultConstructible的要求
由于默认构造函数被删除,编译器会正确地报告错误
在链接页面的下方:
返回值
如果不存在具有键的元素,则引用新元素的映射值。否则,将引用其键等效于键的现有元素的映射值
如果不存在具有给定键的元素,则函数将插入新元素。需要默认构造函数才能插入新元素。映射的
运算符[]
要求值类型具有默认构造函数,以便在键不存在的情况下创建条目。您应该做的是类似于autoi=my\u map.find(key\u);如果(i!=my_-map.end()){auto&val=i->second;…}或者{handle_-non_-existence_-key()}
阅读:“当使用默认分配器时,这意味着键类型必须是可移动的,映射的键类型必须是可默认构造的。”映射的操作符[]
要求值类型具有默认构造函数,以便在键不存在时创建条目。您应该做的是类似于autoi=my\u map.find(key\u);如果(i!=my_-map.end()){auto&val=i->second;…}或者{handle_-non_-existence_-key()}
阅读:“使用默认分配器时,这意味着键类型必须是可移动构造的,而映射的键类型必须是可默认构造的。”