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

Ale*_*der 3 c++ language-lawyer c++14

例如,clang不编译此代码,因为struct A下面的默认默认构造函数A() = default;不被视为用户提供.

struct A{ A() = default; };
const A a;
Run Code Online (Sandbox Code Playgroud)

但如果你看[dcl.fct.def.general]/1,你会看到:

function-body:
     ctor-initializer opt compound-statement
     function-try-block
    = default ;
    = delete ;

也就是说,= default;函数体的默认构造函数A::A(),这是相同的话说,定义A() = default;上述相当于A(){}{}是身体的默认构造函数.

顺便说一句,g++汇编上面的片段,但我知道g++在这方面还有其他问题,根据Jonathan Wakely的评论.

T.C*_*.C. 7

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

如果函数是用户声明的,并且在第一个声明中未明确默认或删除,则用户提供该函数.

这样做可以让你保持琐碎属性= default;.否则,没有办法给另一个构造函数的类一个普通的默认构造函数.