默认的默认构造函数,为什么不是用户提供的默认构造函数?
问题描述:
例如,clang
不编译该代码,这是因为,低于struct A
的缺省默认的构造,A() = default;
不被认为是用户提供的。默认的默认构造函数,为什么不是用户提供的默认构造函数?
struct A{ A() = default; };
const A a;
但是,如果你看一下[dcl.fct.def.general]/1你会看到:
功能体:
构造函数初始化程序选择复合语句
功能试块
= default ;
= delete ;
也就是说,= default;
是默认的构造函数A::A()
,这是相同的话说,函数体上述定义A() = default;
相当于A(){}
为{}
是默认构造函数的主体。
顺便说一下,g++
编译上面的代码片段,但是我知道g++
在这方面还有其他问题,根据Jonathan Wakely的this comment。
答
因为标准是这样说的([dcl.fct.def.default]/5):
的功能被用户提供如果是用户声明并没有明确 拖欠或首次声明中删除。
这样做可以让您使用= default;
来维护平凡性属性。否则,没有办法给另一个构造函数一个简单的默认构造函数。
奇怪,你说,[clang失败](http://coliru.stacked-crooked.com/a/45816775ce659464),[gcc编译](http://coliru.stacked-crooked.com/a/ 137a9ea1c836152b)。 VS2015也是如此。 – wally
用户提供的显式默认类似于struct A {A();}; A :: A()=默认;' – 0x499602D2