2016-10-22 211 views
3

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

+0

奇怪,你说,[clang失败](http://coliru.stacked-crooked.com/a/45816775ce659464),[gcc编译](http://coliru.stacked-crooked.com/a/ 137a9ea1c836152b)。 VS2015也是如此。 – wally

+1

用户提供的显式默认类似于struct A {A();}; A :: A()=默认;' – 0x499602D2

回答

7

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

的功能被用户提供如果是用户声明并没有明确 拖欠或首次声明中删除。

这样做可以让您使用= default;来维护平凡性属性。否则,没有办法给另一个构造函数一个简单的默认构造函数。

+0

您的回答非常好,并且重点突出。谢谢(+1) – Alexander

+0

我想您所提供的报价“删除”一词是没有必要的,因为[dcl.fct.def.delete/4](http://eel.is/c++draft/ dcl.fct.def.delete#4)已经禁止在函数第一次声明后发生已删除的定义。我在这里错过了什么吗? – Alexander

+0

@Alexander使'A()= delete;'不是用户提供的。 –