Подтвердить что ты не робот

Delete modifier vs объявление функции как закрытой

Я читаю этот вопрос, но это все еще не имеет для меня большого смысла. Он по-прежнему звучит скорее как функция покрытия сахаром.

Какая разница между:

class A 
{
// public/private ?
    A (const A&) = delete; 
};

и

class A 
{
private:
    A (const A&); // MISSING implementation
};

То же самое для operator= или других функций.

4b9b3361

Ответ 1

Одно из отличий заключается в том, что =delete допускает ошибки компиляции, в то время как в некоторых случаях декларация без определения вызывается только в link-time (при которой сообщение об ошибке обычно не указывает на источник проблемы). Одним из таких случаев является добавление функции-члена, которая пытается скопировать экземпляр A. Даже если это не является функцией-членом из A, сообщение об ошибке, указывающее, что copy-ctor равно private, не так ясно, как использование =delete.

Чтобы избежать путаницы, я рекомендую вам удалить удаленную функцию public, так как иначе вы получите дополнительные и вводящие в заблуждение сообщения об ошибках.

Ответ 2

Различие заключается в том, что цель кода =delete является явной в этом цели. Объявление функций как private/недоступных было трюком. Хотя большинство людей это понимало, возникшая ошибка была неясной (ошибка уровня соединения/уровня доступа вместо семантической проблемы в коде - т.е. "Вы используете удаленную функцию" ).

Ответ 3

Одно отличие состоит в том, что старомодная форма дает поведение undefined, если класс (или друг) пытается уничтожить себя. Внутри членов класса и друзей деструктор доступен, поэтому при его использовании отсутствует ошибка времени компиляции. Вместо этого вы получаете нарушение правила Единого определения. На практике это вызовет ошибку связи, но формально поведение undefined.

Удаление конструктора (или другой функции) вызывает ошибку компиляции, если функция необходима в любых обстоятельствах; и заявляет о намерении более явно, позволяя компилятору лучше диагностировать сообщения. Это особенно полезно, когда функции неявно удаляются из-за того, что что-то еще удалено.