Модификатор удаления против объявления функции как частной
Я прочитал этот вопрос, но он все еще не имеет большого смысла для меня. Это все еще звучит как особенность сахарного покрытия.
В чем разница между:
class A
{
// public/private ?
A (const A&) = delete;
};
а также
class A
{
private:
A (const A&); // MISSING implementation
};
То же самое для operator=
или другие функции.
4 ответа
Одно отличие состоит в том, что =delete
допускает ошибки во время компиляции, в то время как в некоторых случаях объявление без определения перехватывается только во время компоновки (когда сообщение об ошибке, как правило, не указывает на источник проблемы). Один из таких случаев - когда вы добавляете функцию-член, которая пытается скопировать экземпляр A
, Даже когда это не функция-член A
сообщение об ошибке копирования private
не так ясно, как с помощью =delete
,
Чтобы избежать путаницы, я рекомендую вам сделать удаленную функцию public
в противном случае вы получите дополнительные и вводящие в заблуждение сообщения об ошибках.
Разница в том, что цель =delete
код явно в своей цели. Объявление функций как private
/ недоступный был трюк. Хотя большинство людей это знали, сгенерированная ошибка была неясной (ошибка уровня связывания / доступа, а не семантическая проблема в коде, т. Е. "Вы используете удаленную функцию").
Одно отличие состоит в том, что старомодная форма дает неопределенное поведение, если класс (или друг) пытается уничтожить себя. В учениках и друзьях деструктор доступен, поэтому при его использовании не возникает ошибка времени компиляции. Вместо этого вы получаете нарушение правила единого определения. На практике это приведет к ошибке ссылки, но формально поведение не определено.
Удаление конструктора (или другой функции) вызывает ошибку компиляции, если функция необходима в любых обстоятельствах; и заявляет намерение более явно, позволяя компилятору давать лучшие диагностические сообщения. Это особенно полезно, когда функции неявно удаляются из-за удаления чего-то еще.
Еще одна вещь, о которой еще не упоминалось: при наследовании/переопределении вы не можете=delete
функция, у которой уже есть тело, но вы можете превратить публичную функцию в приватную, сделав ее практически недоступной извне.