使用带有显式构造函数的非可复制类型进行C++ 11数组初始化

Joh*_*nck 7 c++ arrays initialization noncopyable c++11

我有一个(第三方)类是不可复制的.我想初始化它们的数组.这是我最好的尝试:

#include <array>

class Thing
{
public:
  explicit Thing(int) {}
  Thing(const Thing&) = delete;
};

int main()
{
  std::array<Thing, 1> things{{{100}}}; // error here
};
Run Code Online (Sandbox Code Playgroud)

GCC 4.7.2说:

错误:从初始化列表转换为'std :: array :: value_type {aka Thing}'将使用显式构造函数'Thing :: Thing(int)'

好的,但这正是我想要的 - 使用显式构造函数.我该怎么表达呢?如果我自己实际调用构造函数,那么我会收到有关正在删除的复制构造函数的错误.我不能使用std::move()因为Thing不可移动(我无法修改它).

到目前为止,我发现的唯一替代方法是/sf/answers/1117397011/,但这是不可取的,因为它是一堆额外的代码加上我需要在我使用它的地方投射"存储"(或保持一个单独的指向它,它添加了我不想要的间接).

我想要一个解决方案,在实际使用的东西时提供最大的性能,而不需要很多丑陋的样板.

Dav*_*ing 1

再一次,C++17 的保证复制省略来拯救:像这样的表达式Thing{100}不再创建对象,而只是指定如何创建其他对象(您的数组元素)。