Неявно сгенерированные конструкторы с явным объявлением деструктора

Дело в том, что 4-е издание языка программирования C++ гласит:

В этом конкретном случае, если вы забыли удалить операцию копирования или перемещения, никакого вреда не будет. Операция перемещения не генерируется неявно для класса, где пользователь явно объявил деструктор. Кроме того, генерация операций копирования не рекомендуется в этом случае (§44.2.3). Это может быть хорошей причиной для явного определения деструктора, даже если компилятор неявно предоставил его (§17.2.3).

Я пробовал этот код:

#include <iostream>
class Foo {
public:
    ~Foo() {}
}
int main() {
    Foo x;
    Foo y(x);
    return 0;
}

и здесь нет ошибок и исключений. Я знаю, что конструктор копирования должен быть сгенерирован неявно в C++98, но 4-й говорит, что копия устарела. Что это значит?

1 ответ

Я понимаю, что неявно объявленный конструктор не обязательно неявно определен.

Из контекста:

Неявно объявленный конструктор копирования
Если для типа класса (struct, class или union) не заданы пользовательские конструкторы копирования, компилятор всегда объявляет конструктор копирования как неявный встроенный открытый член своего класса.

Неявно определенный конструктор копирования
Если неявно объявленный конструктор копирования не является ни удаленным, ни тривиальным, он определяется (то есть, тело функции генерируется и компилируется) компилятором, если используется odr.
Генерация неявно определенного конструктора копирования не рекомендуется, если у T есть пользовательский деструктор или пользовательский оператор назначения копирования.

Таким образом, в вашем случае конструктор копирования неявно объявляется, но не определяется неявно, если не используется odr, что в основном означает, что он не определен, если где-то не требуется.

См. Также: Каково различие между неявно объявленными и неявно определенными конструкторами копирования?

Другие вопросы по тегам