【问题标题】:Can't assign empty initializer to vector of unique_ptrs无法将空初始值设定项分配给 unique_ptrs 的向量
【发布时间】:2020-09-19 07:23:24
【问题描述】:

我有以下代码:

std::unordered_map<std::string, std::vector<std::unique_ptr<class EventTrigger>>> triggers;

if (triggers.end() == triggers.find(eventName)) {
   triggers[eventName] = {};
}

这会导致有关使用已删除的 unique_ptr 构造函数的错误。另一方面,如果我这样做,一切都编译得很好:

if (triggers.end() == triggers.find(eventName)) {
   triggers[eventName] = std::vector<std::unique_ptr<class EventTrigger>>();
}

谁能解释为什么会这样?我认为空的初始化列表会导致一个空向量被分配给triggers[eventName]

【问题讨论】:

  • 顺便说一下,如果你的目标是添加具有默认值的键,你可以写triggers[eventName];。您无需先检查 find - operator[] 会同时执行查找和“如果不存在则插入默认值”部分。
  • 不过,请在其后添加评论,否则有人会认为这是一个意外。

标签: c++ c++11 vector unique-ptr unordered-map


【解决方案1】:

triggers[eventName] = {} 解析为 vector&lt;T&gt;::operator=(std::initializer_list&lt;T&gt;)。此运算符需要将元素从初始化列表复制到向量。

triggers[eventName] = std::vector&lt;...&gt;() 解析为 vector&lt;T&gt;::operator=(vector&lt;T&gt;&amp;&amp;) - 移动赋值运算符。这不需要复制任何元素,只需转移现有存储的所有权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多