C 11数组初始化,使用具有显式构造函数的非可复制类型

C 11数组初始化,使用具有显式构造函数的非可复制类型,第1张

概述我有一个(第三方)类是不可复制的.我想初始化它们的数组.这是我最好的尝试: #include <array>class Thing{public: explicit Thing(int) {} Thing(const Thing&) = delete;};int main(){ std::array<Thing, 1> things{{{100}}}; // error 我有一个(第三方)类是不可复制的.我想初始化它们的数组.这是我最好的尝试:
#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,但这是不可取的,因为它是一堆额外的代码加上我需要在我使用它的地方投射“存储”(或者保留一个单独的指针,这增加了间接我不会我想).

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

解决方法 再一次,C 17的 guaranteed copy elision拯救了:像Thing {100}这样的表达式不再创建一个对象,而只是指定了如何创建其他对象(你的数组元素). 总结

以上是内存溢出为你收集整理的C 11数组初始化,使用具有显式构造函数的非可复制类型全部内容,希望文章能够帮你解决C 11数组初始化,使用具有显式构造函数的非可复制类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存