使用构造函数定义 class 对象的 unique_ptr 数组的正确语法

Proper syntax for defining a unique_ptr array of class objects with a constructor

我想要一个包含 class 个对象的数组 unique_ptr:

std::unique_ptr<MyClass[]> arr(new MyClass[n]);

MyClass 没有默认构造函数(在我的例子中不应该有),所以我必须在这里明确说明。我不知道该怎么做,所以它在语法上是正确的。使用显式初始化编写 class 对象的 unique_ptr 数组的正确方法是什么?

澄清

我有一个 MyClass 的非默认构造函数,像这样:

MyClass instance(arguments);

除了成员初始化之外,构造函数中也有一些计算。我想创建一个包含 MyClass 个实例的 unique_ptr 数组,并为每个实例调用构造函数。我以后不能这样做,因为 MyClass 没有默认构造函数。我可以把 (arguments) 放在 std::unique_ptr<MyClass[]> arr(new MyClass[n]) 的某个地方吗?

下面的答案基于问题的先前版本,其中数组大小似乎是一个 compile-time 常量。如果创建的数组的大小不是 compile-time 常量,则不可能将参数传递给元素的构造函数。在那种情况下,std::vector 可能是比 array-std::unique_ptr.

更好的选择

对于数组,它的工作方式与往常一样,使用聚合初始化:

std::unique_ptr<MyClass[]> arr(new MyClass[]{
    {...},
    {...},
    {...},
    {...},
    {...}});

其中 ... 替换为五个元素的构造函数的参数列表。

或者如果您不能对元素使用 list-initialization,例如因为那会无意中使用 std::initializer_list 构造函数:

std::unique_ptr<MyClass[]> arr(new MyClass[]{
    MyClass(...),
    MyClass(...),
    MyClass(...),
    MyClass(...),
    MyClass(...)});

std::make_unique 通常是创建 std::unique_ptr 的首选,但目前没有允许将参数传递给各个数组元素的构造函数的重载。


如果您想将相同的参数列表传递给每个元素,假设类型为 copy-constructible,一个简单的解决方案是声明一个实例,然后 copy-construct 来自该实例的元素:

MyClass instance(arguments);
std::unique_ptr<MyClass[]> arr(new MyClass[]{instance, instance, instance, instance, instance);

否则你可以编写一个模板函数来为你扩展这些重复的项目。 (稍后可能会添加示例。)