非法使用已删除功能

Posted

技术标签:

【中文标题】非法使用已删除功能【英文标题】:illegal use of deleted function 【发布时间】:2018-03-14 19:27:09 【问题描述】:

我有一个 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_];

我明白了

非法使用已删除的方法

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

【问题讨论】:

映射的operator[] 要求值类型具有默认构造函数,以便在键不存在的情况下创建条目。你应该做的是auto i = my_map.find(key_); if (i != my_map.end()) auto& val = i->second; ... else handle_non_existent_key(); 阅读documentation:"当使用默认分配器时,这意味着key_type必须是MoveConstructible,mapped_type必须是DefaultConstructible。" 【参考方案1】:

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

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

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

在链接页面的下方:

返回值

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

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

【讨论】:

以上是关于非法使用已删除功能的主要内容,如果未能解决你的问题,请参考以下文章

该页面可能已被非法篡改,怎么解决

非法删除堆栈对象[重复]

打开网站提示“提交的参数非法,已记录你的ip”

LLVM 之 Clang 静态分析器篇:程序缺陷诊断——非法读写已释放的内存

网站非法信息监测处理

CPP:使用已删除功能