C++ 为什么在不使用删除的函数时编译器失败并显示错误代码 C2280

C++ Why the compiler failed with the error code C2280 when the deleted function is not used

我正在尝试理解为何从未使用已删除的函数时编译器失败并显示错误代码 C2280(尝试引用已删除的函数)。

这是一个失败的代码示例

class A {
public:
    A() { 
        cout << "default" << endl;
    }

    A(A const&) {
        cout << "copy" << endl;
    }

    A(A&&) = delete;

    A create() {
        return A();
    }
};

void main() {
    A a;
    A b(a.create());
}

和我看不懂的代码一样

class A {
public:
    A() { 
        cout << "default" << endl;
    }

    A(A const&) {
        cout << "copy" << endl;
    }

    A(A&&) {
        cout << "move" << endl;
    }

    A create() {
        return A();
    }
};

void main() {
    A a;
    A b(a.create());
}

此代码编译但不在控制台上显示 "move"。

结果是

default
default

在 C++17 之前,复制省略是一个可选的优化,但编译器仍然必须检查 copy/move 构造函数是否可用。从 C++17 开始,您的代码将无错误地编译。