加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:00:50 所属栏目:百科 来源:网络整理
导读:假设我有一些带有删除拷贝构造函数的类: 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不可复制,因此失败.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读