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。