8

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

#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 说:

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

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

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

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

4

3 回答 3

2

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

于 2017-09-18T01:59:30.947 回答
1

我尝试添加默认的移动 ctor 和移动赋值运算符,稍微更改了初始化并编译:

#include <array>

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

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

编辑:我错过了“第三方”部分。对不起,如果这没有帮助:)

于 2014-04-08T05:11:06.640 回答
-2

您可以使用std::vector

std::vector<Thing> things;
things.reserve(1);
things.emplace_back(100);

或仅针对一个元素boost::optional

boost::optional<Thing> thing;
thing.emplace(100);
于 2015-06-24T20:28:29.083 回答