例如,clang
不会编译此代码,因为下面struct A
的默认默认构造函数A() = default;
不被视为用户提供。
struct A{ A() = default; };
const A a;
但如果你看[dcl.fct.def.general]/1,你会看到:
功能体:
ctor-initializer opt 复合语句
功能试块
= default ;
= delete ;
也就是说,= default;
是默认构造函数A::A()
的函数体,这与上面的定义A() = default;
相当于A(){}
{}
是默认构造函数的主体。
顺便说一句,g++
会编译上面的代码段,但我知道g++
在这方面有其他问题,根据Jonathan Wakely的this comment。
答案 0 :(得分:7)
因为标准是这样说的([dcl.fct.def.default]/5):
如果用户声明的功能是用户提供的,则不是 明确默认或删除第一份声明。
这样做可以让你用= default;
来维护琐碎属性。否则,没有办法让一个类与另一个构造函数成为一个普通的默认构造函数。