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/

10-10 00:16
查看更多