作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个不可复制的(第三方)类。我想初始化它们的数组。这是我最好的尝试:
#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/
我是一名优秀的程序员,十分优秀!