将默认构造函数合成为已删除
synthesized default constructor as deleted
我在书中读到了这一点:
如果成员具有已删除或无法访问的副本分配运算符,或者如果类具有const或引用成员。
为什么我们不能使用引用类型?
您谈论的是默认构造函数(而不是重新分配或复制构造函数)。
类型未显式定义默认构造函数的const成员
它禁止默认构造函数,否则您将有一个未初始化的常量值(因此毫无用处)。(如果它不是const
,那么它未初始化的事实不是问题,我们可以稍后分配它)。
没有类内初始值设定项的引用成员
它也是被禁止的,因为引用类似于非null常量指针。
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
值。和引用类似于非null常量指针。
请注意,复制构造函数没有此限制,因为您可能(并且必须)初始化常量值。
相关文章:
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 删除显式默认函数声明时的警告
- 删除使数据处于"错误状态"的默认构造函数的模式?
- 为什么删除默认构造函数 A::A() 时会编译"A a{};"?
- 为什么这不是"调用隐式删除的'QQmlElement'的默认构造函数"中的默认构造函数
- 默认移动成员定义为已删除,而未定义特殊成员?
- 删除复制构造函数是否也会删除默认的复制/移动运算符?
- 是否可以默认初始化具有已删除默认构造函数的类类型
- 为什么删除默认参数会破坏此 constexpr 计数器?
- 如果构造函数被显式默认或删除,为什么聚合初始化自 C++20 以来不再起作用
- 为什么在派生类中删除默认构造函数
- 删除默认类构造函数有什么意义?
- 有条件地实例化具有删除默认构造函数的类
- 何时应删除默认的移动构造函数时令人困惑的事情
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 为什么可以删除任何函数,而只能删除默认的特殊成员函数
- 已删除默认构造函数.仍然可以创建对象..有时
- 了解Lambda闭包类型如何删除默认构造函数
- 使用boost program_options处理帮助消息,删除默认值或重新格式化帮助消息