具有显式构造函数的不可复制类型的 C++11 数组初始化

标签 c++ arrays c++11 initialization noncopyable

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

#include <array>

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

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

GCC 4.7.2 说:

error: converting to ‘std::array::value_type {aka Thing}’ from initializer list would use explicit constructor ‘Thing::Thing(int)’

好的,但这正是我想要的——使用显式构造函数。我该如何表达?如果我真的自己调用构造函数,那么我会收到一个关于复制构造函数被删除的错误。而且我不能使用 std::move() 因为 Thing 是不可移动的(我不能修改它)。

到目前为止,我发现的唯一替代方法是 https://stackoverflow.com/a/15962814/4323但这是不可取的,因为它是一堆额外的代码,而且我需要在我使用它的任何地方强制转换“存储”(或者保留一个单独的指向它的指针,这会增加我不想要的间接性)。

我想要一个解决方案,在实际使用 Things 时提供最佳性能,而不需要太多丑陋的样板。

最佳答案

再一次,C++17 的 guaranteed copy elision来救援:像 Thing{100} 这样的表达式不再创建对象,而只是指定如何其他对象(您的数组元素)将被创建。

关于具有显式构造函数的不可复制类型的 C++11 数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22926967/

相关文章:

C++ - std::array 类型的二维矩阵的定义

c++ - `unique_ptr::operator bool()` 是否为已从 move()d move 的 unique_ptr 定义?

C:两个数组相除

javascript - 如何使用扩展组合对数组的响应?

c++ - 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - 在 C++ 中吗?

c++ - 编写线程安全的容器

javascript - Lodash.js 相当于搜索符合条件的对象

c++ - 构造函数和析构函数必须是虚的?

c++ - 在字符串函数中读取小数点后 2 位

C++ 构造函数 : why is this virtual function call not safe?