我有以下代码:

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>>();
}

谁能解释为什么会这样?我认为空的初始值设定项列表会导致将空 vector 分配给triggers[eventName]

最佳答案

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

07-24 14:14