该部分N3797::12.8/11 [class.copy]说:
隐式声明的复制/移动构造函数是其类的内联公共成员.如果X具有以下内容,则将类X的默认复制/移动构造函数定义为已删除(8.4.3):
[...]
- 类型M(或其数组)的非静态数据成员,由于应用于M的相应构造函数的重载解析(13.3),无法复制/移动,导致模糊或被删除或 无法访问的函数默认构造函数
关于相应的复制/移动构造函数的歧义的第一个案例非常清楚.我们可以写下面的内容:
#include <iostream>
using namespace std;
struct A
{
A(){ }
A(volatile A&){ }
A(const A&, int a = 6){ }
};
struct U
{
U(){ };
A a;
};
U u;
U t = u;
int main(){ }
Run Code Online (Sandbox Code Playgroud)
反映这一点.但是,默认构造函数中删除或无法访问的函数或函数是什么?使用默认构造函数无法访问的函数有什么作用?你能举一个反映这个的例子吗?
简单的说:
struct M { M(M const&) =delete; };
struct X { X(X const&) =default; M m; }; // X(X const&) is actually deleted!
Run Code Online (Sandbox Code Playgroud)
隐式声明的函数也被视为"默认"([dcl.fct.def.default]/5); 一个更熟悉的前C++ 11示例可能是这样的:
struct M { protected: M(M const&); };
struct X { M m; }; // X's implicit copy constructor is deleted!
Run Code Online (Sandbox Code Playgroud)
请注意,如果在声明函数后显式默认该函数,如果该函数将被隐式删除([dcl.fct.def.default]/5),则该程序格式错误:
struct M { M(M const&) =delete; };
struct X { X(X const&); M m; };
X::X(X const&) =default; // Not allowed.
Run Code Online (Sandbox Code Playgroud)