默认的默认构造函数,为什么它不是用户提供的默认构造函数?

时间:2016-10-22 18:13:02

标签: c++ c++14 language-lawyer

例如,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

1 个答案:

答案 0 :(得分:7)

因为标准是这样说的([dcl.fct.def.default]/5):

  

如果用户声明的功能是用户提供的,则不是   明确默认或删除第一份声明。

这样做可以让你用= default;来维护琐碎属性。否则,没有办法让一个类与另一个构造函数成为一个普通的默认构造函数。