在没有复制构造函数的情况下实例化 std::vector 的唯一元素

instantiating unique elements of std::vector without a copy constructor

假设我有一个 std::vector,我有一个 class。我想初始化这个向量的所有元素,但是对于这些元素中的每一个,class 的构造函数都将采用唯一的参数。

我是否需要为 class 提供一个复制构造函数,或者是否有一些奇怪的语法可以在不使用等号的情况下实例化 std::vector 的元素?

您可以直接使用 emplacement 操作在向量中创建新元素。

例如:

struct X { X(int, char); X(std::string, double, bool); };

std::vector<X> v;

v.emplace_back(1, 'x');              // direct-initializes element X(1, 'x')
v.emplace_back("foo", 1.5, false);   // ditto with element X("foo", 1.5, false)

基本上,emplace_back 类似于 push_back,但直接创建对象(甚至使用显式构造函数)。请注意,您的 X 仍然需要可复制或可移动,因为推回新元素需要重新分配,这需要复制或移动。 (此外,插入中间需要可分配性。)不可移动的元素(例如std::mutex)只能进入基于节点的容器(例如std::list),也与安置。一旦插入,节点将永远不会移动。