Модификатор удаления против объявления функции как частной

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

В чем разница между:

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функция, у которой уже есть тело, но вы можете превратить публичную функцию в приватную, сделав ее практически недоступной извне.

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