N4296::12.8/11 [class.copy]
告诉我们以下内容:
因此尚不清楚为什么该程序
struct X
{
};
struct Y
{
X&& x;
Y(Y const&)= default;
};
int main() { }
DEMO
工作正常,但以下情况:
struct X
{
};
struct Y
{
X&& x;
Y(Y const&);
};
Y::Y(Y const&)= default; //error
int main() { }
DEMO
最佳答案
[dcl.fct.def.default] / p5,重点是:
这是有道理的,因为对删除函数的任何使用都会使程序格式错误,但是使用用户提供的显式默认函数,可能无法在调用站点进行诊断:
// 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
的副本构造函数外,不知道它的存在。它不知道它是默认值,也无法诊断它实际上已被删除。可以诊断出此类错误的唯一地方是明确指定该功能的地方。关于c++ - 用户提供的构造函数与显式默认的构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28555280/