C++ 默认的默认构造函数,为什么不是用户提供的默认构造函数?
例如,C++ 默认的默认构造函数,为什么不是用户提供的默认构造函数?,c++,c++14,language-lawyer,C++,C++14,Language Lawyer,例如,clang不编译此代码,因为下面的struct A的默认默认构造函数,A()=default不被认为是用户提供的 struct A{ A() = default; }; const A a; 但如果你看一下,你会发现: 功能体: ctor初始值设定项OPT复合语句 功能试块 =默认值 =删除 即,=default是默认构造函数A::A()的函数体,这与定义A()=default相同相当于A(){},因为{}是默认构造函数的主体 顺便说一句,g++编译了上面的代码段,但据Jonathan
clang
不编译此代码,因为下面的struct A
的默认默认构造函数,A()=default代码>不被认为是用户提供的
struct A{ A() = default; };
const A a;
但如果你看一下,你会发现:
功能体:
ctor初始值设定项OPT复合语句
功能试块
=默认值代码>
=删除代码>
即,=default
是默认构造函数A::A()
的函数体,这与定义A()=default相同上面的code>相当于A(){}
,因为{}
是默认构造函数的主体
顺便说一句,g++
编译了上面的代码段,但据Jonathan Wakely说,我知道g++
在这方面还有其他问题 因为标准上这么说():
如果函数是用户声明的,而不是
在第一次声明时显式默认或删除
通过这种方式,您可以使用=default代码>。否则,就无法为具有另一个构造函数的类指定一个微不足道的默认构造函数。奇怪,正如您所说。VS2015也是如此。用户提供的显式默认值类似于struct A{A();};A::A()=默认值代码>我认为您提供的引号中的术语“deleted”是不必要的,因为[[dcl.fct.def.delete]/4]()已经禁止在函数的第一次声明之后出现已删除的定义。我是不是漏掉了什么?@Alexander这使得A()=delete代码>不是用户提供的。但至少在默认情况下,我们知道该函数是用户提供的或由编译器隐式提供的。但对于一个被显式删除的函数,我感到困惑,因为据我所知,这个函数从未定义过。定义这样一个永远不会被调用的函数的目的是什么?@Alexander我不明白你的问题<代码>=删除代码>是一个定义。分类A()=删除代码>非用户提供并不意味着您可以自己定义它。