c – 使用noncopyable成员聚合类的初始化

c – 使用noncopyable成员聚合类的初始化,第1张

概述假设我有一些带有删除拷贝构造函数的类: struct NoCopy{ NoCopy(int) {} NoCopy(const NoCopy &) = delete;}; 我在另一个类中使用这个类: struct Aggregate{ NoCopy nc;}; 但是当我尝试使用聚合初始化时 int main(){ Aggregate a{3};} 编译器输 假设我有一些带有删除拷贝构造函数的类:

struct Nocopy{    Nocopy(int) {}    Nocopy(const Nocopy &) = delete;};

我在另一个类中使用这个类:

struct Aggregate{    Nocopy nc;};

但是当我尝试使用聚合初始化时

int main(){    Aggregate a{3};}

编译器输出以下错误:

error: use of deleted function ‘Nocopy::Nocopy(const Nocopy&)’

为什么聚合初始化需要类成员的副本构造函数?聚合初始化是否使用复制构造函数初始化所有成员?

解决方法 您想要的正确语法是:

Aggregate a{{3}};

这为Nocopy成员提供了初始化程序.如果没有额外的{},编译器需要执行从int到Nocopy的转换(它很乐意通过非显式构造函数执行),然后使用它来构造nc.这通常会作为移动构造发生,但通过删除复制文件,您也有效地删除了移动构造函数.

考虑它的一种更简单的方法可能是想象Nocopy有一个值构造函数采用两个参数而不是一个:

struct Nocopy {    Nocopy(int,int);};

现在如果你写了

Aggregate a{1,2};

这表示1用于初始化nc,2用于初始化其他东西(编译时错误).你必须为此添加额外的{}才有意义

Aggregate a{{1,2}};

第三种方法是查看函数调用:

struct Nocopy {  Nocopy(int) {}  Nocopy(const Nocopy &) = delete;};voID fun(Nocopy) { }int main() {  fun(1); // wrong  fun({1}); // right}

在//错误版本中,使用Nocopy(int)构造函数在调用点处构造临时Nocopy对象.然后,临时值通过值传递给fun,但由于Nocopy不可复制,因此失败.

在//右侧版本中,您将为要构造的参数提供初始化列表.没有制作副本.

总结

以上是内存溢出为你收集整理的c – 使用noncopyable成员聚合类的初始化全部内容,希望文章能够帮你解决c – 使用noncopyable成员聚合类的初始化所遇到的程序开发问题。

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

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

原文地址:https://www.54852.com/langs/1217054.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存