合成的默认构造函数已删除

时间:2014-08-31 15:18:58

标签: c++ copy-assignment

我在书中读到了这个:

  

如果a,则将合成的复制赋值运算符定义为已删除   成员具有已删除或无法访问的复制赋值运算符,或者如果   该类有一个const或引用成员。

为什么我们不能使用引用类型?

1 个答案:

答案 0 :(得分:1)

您正在谈论默认构造函数(而不是重新分配或复制构造函数)。

  

const成员,其类型未明确定义默认构造函数

它禁止默认构造函数,否则你将有一个未初始化的const值(因此无用)。 (如果它不是const,它未初始化的事实不是问题,我们可以稍后再分配。)

  

没有类内初始值设定项的引用成员

它也被禁止,因为引用类似于非空的const指针。

struct NoDefaultConstructor
{
    // No default constructor can be generated.

    const int i; // which value to set by default ?
    int& r; // reference which object by default?
};

struct InClassInitializerSoDefaultConstruct
{
    // default constructor is generated here.
    const int i = 42;
    int j;
    int& r = j;
};

编辑以回答编辑过的问

对于分配,const值无法更改。 和引用就像非空的const指针。

请注意,复制构造函数没有此限制,因为您可能(并且必须)  初始化const`值。