
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成员聚合类的初始化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)