C++ 用户提供的构造函数与显式默认构造函数

C++ 用户提供的构造函数与显式默认构造函数,c++,class,constructor,C++,Class,Constructor,N4296::12.8/11[class.copy]告诉我们: struct X { }; struct Y { X&& x; Y(Y const&); }; Y::Y(Y const&)= default; //error int main() { } 类X的默认复制/移动构造函数定义为已删除 (8.4.3)如果X有: [……] (11.2)-潜在构造的M型子对象(或其数组) 无法复制/移动,因为重载分辨率(13.3),如 应用于M的相

N4296::12.8/11[class.copy]
告诉我们:

struct X
{
};

struct Y
{
    X&& x; 
    Y(Y const&);
};

Y::Y(Y const&)= default; //error

int main() { }
类X的默认复制/移动构造函数定义为已删除 (8.4.3)如果X有:

[……]

(11.2)-潜在构造的M型子对象(或其数组) 无法复制/移动,因为重载分辨率(13.3),如 应用于M的相应构造函数,会导致歧义或 从默认值中删除或无法访问的函数 建造师

[……]

所以不清楚为什么会有这样的计划

struct X
{
};

struct Y
{
    X&& x; 
    Y(Y const&)= default;
};

int main() { }

工作正常,但有以下几点:

struct X
{
};

struct Y
{
    X&& x; 
    Y(Y const&);
};

Y::Y(Y const&)= default; //error

int main() { }

[dcl.fct.def.default]/p5,强调:

如果函数是用户声明的,而不是 在第一次声明时显式默认或删除。A. 用户提供的显式默认函数(即显式 在以下位置定义了 它是明确默认的如果隐式定义了这样一个函数 删除时,程序格式不正确

这是有意义的,因为任何使用已删除函数都会导致程序格式错误,但如果用户提供明确的默认函数,则可能无法在调用站点诊断此问题:

// y.h
struct X
{
};

struct Y
{
    X&& x; 
    Y(Y const&);
};

// y.cpp
#include "y.h"
Y::Y(Y const&)= default; //defined as deleted

// main.cpp
#include "y.h"

int main() {
   Y y = Y();
}

编译
main.cpp
时,编译器不知道
Y
的复制构造函数是否存在;它不知道它是默认的,也不可能诊断它是否实际被删除。唯一可以诊断此类错误的地方是函数显式默认的地方。

如果使用了odr构造函数,包含已删除构造函数(在我的情况下是复制构造函数)的程序是否会格式错误?@DmitryFucintv哪个程序?如果引用已删除的函数而不是声明它,则程序的格式是错误的,例如。如果我可以这么说的话,在程序中使用了复制构造函数odr。我的意思是,关于使用已删除构造函数的规则是否与odr使用的概念有关。例如,如果使用的是odr已删除的构造函数,则程序的格式不正确或类似。@DmitryFucintv任何使用都已足够,包括在未计算的操作数中;不需要使用odr。