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

A defaulted default constructor, why is it not a user-provided default constructor?

本文关键字:默认 构造函数 用户 为什么不      更新时间:2023-10-16

例如,clang不编译这段代码,因为struct A的默认默认构造函数A() = default;不被认为是用户提供的。

struct A{ A() = default; };
const A a;

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

函数体:
,,,, ctor-initializer <子>选择复合语句
,,,, function-try-block
,,,,= default ;
,,,,= delete ;

也就是说,= default;是默认构造函数A::A()函数体,也就是说,上面的A() = default;定义等同于A(){},因为{}是默认构造函数的体。

顺便说一下,g++编译了上面的代码片段,但我知道g++在这方面有其他问题,根据Jonathan Wakely的评论。

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

函数是用户提供的,如果它是用户声明的而不是在第一次声明时显式默认或删除。

这样做允许您维护= default;的琐碎属性。否则,就无法为带有另一个构造函数的类提供一个简单的默认构造函数。