C ++ Почему не удалось компилятору с кодом ошибки C2280, когда удаленная функция не используется - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь понять, почему компилятор завершился ошибкой с кодом ошибки 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());
}

Этот код компилируется, но не отображает "перемещение" на консоли.

В результате получается

default
default

1 Ответ

2 голосов
/ 13 апреля 2019

До C ++ 17 исключение копирования было необязательной оптимизацией, но компилятору по-прежнему приходилось проверять, доступен ли конструктор копирования / перемещения.Начиная с C ++ 17 ваш код будет скомпилирован без ошибок.

...