使用=默认的意思=删除
下面的代码以及编译:使用=默认的意思=删除
struct B { B(int) {}
};
struct D : B {
D() = default;
};
直到我要创建D
类的一个实例:
D d; // error: use of deleted function 'D::D()'
是否有任何理由(用例)允许= default
为D
的构造函数,当它的实际工作为= delete;
?
回答:
g++
给出了错误一个很好的解释:
bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;
默认构造函数将试图建构的D
各地。您没有字段,但它有一个初始B
- 它没有空构造函数,只有一个int
。
默认行为有意义 - D
不应该有一个空的构造函数,除非它明确指出使用哪个int
构造B
,并且编译器不想猜测。否则,您将有一个D
对象,并且根据在B
构造函数B
中发生的情况,可能包含垃圾,例如初始化字段。
我不知道,如果你的意思是你的问题从字面上,当你问这是为什么“允许”,作为B
默认构造函数被删除,但我能想到的原因有两个:
- 这行为是明确的,并且没有理由拒绝它。无论如何,只有在您尝试非法构建某件事情时才能检测到错误。
- 它更灵活 - 将
B
更改为具有默认构造函数将自动允许D
有一个。
回答:
Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?
它不能作为=delete
工作。它说了它应该说的内容。您明确希望编译器生成默认实现。
只是碰巧编译器生成了一个必须被定义删除。因为B
的默认构造函数被隐式删除。
回答:
B
有一个非默认构造函数(它的构造函数接受一个没有默认值的参数)。
派生D
类,因此没有默认的构造函数,它的默认构造函数被删除(如编译器不能生成D
一个构造函数可以调用B(int)
构造它的父类的。)
D() = default;
只是说您需要D
的默认构造函数,并且如上所述,将删除默认的构造函数。
以上是 使用=默认的意思=删除 的全部内容, 来源链接: utcz.com/qa/264570.html