1

我有一个包含 unique_ptr 的类。我想将此类的实例放在容器中(特别是 std::map)。这可以使用std::move.emplace但是,我想在容器的初始化列表中执行所有这些初始化。这可能吗?

我怀疑Foo在初始化列表中被初始化,然后被复制,这导致了问题。我尝试std::move在初始化列表中添加一个,但这并没有解决问题。

class Foo
{
public:
  std::unique_ptr<std::string> my_str_ptrs;
}

编译失败“试图访问已删除的函数”。这是我想做的一个例子

std::map<std::string, Foo> my_map{
  {"a", Foo{}}
};

编译成功

std::map<std::string, Foo> my_map;
my_map.emplace("a", Foo{});
4

1 回答 1

2

这是错误的std::initializer_list,如果你看它的开始/结束成员函数,它们返回const T*,这意味着它将强制std::map尝试使用你的复制构造函数Foo,这是deleted无法std::unique_ptr复制的。

这个问题不是唯一的std::map,任何允许你初始化它的容器std::initializer_list都会真正从初始化列表中复制参数。

C++ 标准要求在这种初始化期间有一个临时const T[N]数组,std::initializer_list指向该数组,const禁用从它移动。

于 2021-09-27T12:59:13.507 回答