【发布时间】:2019-10-20 23:18:44
【问题描述】:
考虑以下类:
class Foo {
int a, b;
public:
Foo() : a{1}, b{2} {} // Default ctor with member initializer list
//Foo() : a{1}, b{2} = default; // Does not work but why?
};
(编辑:因为在几个答案中都提到了它 - 我知道课堂成员初始化器,但这不是重点)
我认为第二个 ctor 定义会更优雅,更适合现代 C++ 代码(另请参阅 why you should use =default if you have to be explicit about using the default semantics)。但是,似乎没有常见的编译器接受它。而 cppreference 对此保持沉默。
我的第一个想法是成员初始值设定项列表以某种方式改变了链接的常见问题解答中解释的“默认语义”,因为它可能会或可能不会默认构造成员。但是对于类内初始化器,我们也会遇到同样的问题,只是这里Foo() = default; 工作得很好。
那么,为什么不允许呢?
【问题讨论】:
-
一旦你在ctor中定义了初始化器,你就提供了一个ctor,它不再是默认值。
-
因为“具有成员初始值设定项列表的默认 ctor”不是默认 ctor。不过,您可以使用“=default”进行内联初始化。
-
@Quimby 这不是一个论点,因为情况总是如此。这也不是
=default的原因,另请参阅参考的 C++ FAQ -
你能解释一下你认为它是什么意思吗?
-
确实,
{}和=default完成不同的事情。{}通常不是您想要的,因为它会杀死隐式生成的默认移动构造函数/操作符。
标签: c++ c++11 language-lawyer default-constructor ctor-initializer