无法将空的初始化程序分配给unique_ptrs的向量

问题描述 投票:4回答:1

我有以下代码:

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]

c++ c++11 vector unique-ptr unordered-map
1个回答
2
投票

triggers[eventName] = {}解析为vector<T>::operator=(std::initializer_list<T>)。此运算符需要将元素从初始值设定项列表复制到向量。

triggers[eventName] = std::vector<...>()解析为vector<T>::operator=(vector<T>&&)-移动分配运算符。这不需要复制任何元素,只需转移现有存储的所有权即可。

© www.soinside.com 2019 - 2024. All rights reserved.