复制构造函数隐式定义为已删除的情况

7 c++ constructor

该部分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)

反映这一点.但是,默认构造函数中删除或无法访问的函数或函数是什么?使用默认构造函数无法访问的函数有什么作用?你能举一个反映这个的例子吗?

use*_*267 6

简单的说:

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)

  • +1,很好[例子](http://coliru.stacked-crooked.com/a/51ef1acf1d514c68) (2认同)