使用初始化列表,其中值包含 unique_ptr 个成员变量

using an initializer list where the values contain unique_ptr member variables

我有一个 class,其中包含一个 unique_ptr。我想将这个 class 的实例放在一个容器中(特别是 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{});

这是 std::initializer_list 的错,如果你看它的 begin/end 成员函数,它们 return const T*,这意味着它会强制 std::map尝试使用 Foo 的复制构造函数,即 deleted,因为 std::unique_ptr 无法复制。

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

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