为什么删除复制构造函数后编译器不生成默认构造函数?

sce*_*gka 1 c++ c++17

以下代码引发错误“没有匹配的构造函数来初始化‘A’”。为什么默认构造函数不能应用于它?我正在使用 C++ 17。

class A {
public:
    A(const A& a) = delete;
    static void test() {
        A a; // raises an error
    }
};
Run Code Online (Sandbox Code Playgroud)

我尝试显式添加默认构造函数,它有效。

for*_*818 9

A没有获取编译器生成的默认构造函数,因为存在用户声明的构造函数。

如果您希望编译器生成默认构造函数的定义但没有复制构造函数,那么就是:

class A {
public:
    A() = default;
    A(const A& a) = delete;
    static void test() {
        A a; // calls A::A()
    }
};
Run Code Online (Sandbox Code Playgroud)

考虑到=delete=default是 c++ 中最近添加的内容,因此在过去声明一些构造函数是防止编译器生成默认构造函数的方法(而现在您可以通过 使其显式化A() = delete;)。如果=delete从一开始就可用的话,事情可能会有所不同,也可能不会。当您声明构造函数时,编译器不会生成默认构造函数。A(const A& a) = delete;正在声明一个构造函数,即使它被删除了。