class my_class
{
...
my_class(my_class const &) = delete;
...
};
Что = delete
значит в этом контексте?
Есть ли другие "модификаторы" (кроме = 0
и = delete
)?
c++
function
c++11
declaration
delete-operator
Пэт О'Киф
источник
источник
#define
а-ля Qt, который оценивает до 0, а затем объявляет скрытую функцию или что-то в этом роде.Ответы:
Удаление функции - это функция C ++ 11 :
источник
=delete
делает метод недоступным даже из контекстов, которые могут видетьprivate
методы (то есть внутри класса и его друзей). Это устраняет любую неопределенность при чтении кода. @Prasoon, во втором примере все еще только удаляются конструкторы - было бы неплохо увидеть,operator long ()
например, удаленное .= delete
лучше, чем использованиеprivate
или другие подобные механизмы, потому что обычно вы хотите, чтобы запрещенная функция была визуально объявлена и рассмотрена на предмет разрешения перегрузки и т. Д., Чтобы она могла как можно раньше завершиться сбоем и предоставила пользователю самую очевидную ошибку. Любое решение, которое включает «скрытие» декларации, уменьшает этот эффект.= 0
означает, что функция является чисто виртуальной, и вы не можете создать экземпляр объекта из этого класса. Вы должны извлечь из него и реализовать этот метод= delete
означает, что компилятор не будет генерировать эти конструкторы для вас. AFAIK это разрешено только в конструкторе копирования и операторе присваивания. Но я не слишком хорош в предстоящем стандарте.источник
=delete
синтаксиса. Например, вы можете использовать его, чтобы явно запретить какие-то неявные преобразования, которые могут иметь место при вызове. Для этого вы просто удалите перегруженные функции. Взгляните на страницу Википедии на C ++ 0x для получения дополнительной информации.= delete
не совсем правильно.= delete
может использоваться для любой функции, в этом случае она явно помечается как удаленная, и любое использование приводит к ошибке компилятора. Для специальных функций-членов это также, в частности, означает, что они не генерируются для вас компилятором, а являются результатом удаления, а не того, что есть на= delete
самом деле.Этот отрывок из языка программирования C ++ [4-е издание] - книга Бьярна Страуструпа рассказывает о реальной цели использования
=delete
:источник
Поскольку, кажется, никто не ответил на этот вопрос, я должен упомянуть, что есть также
=default
.https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
источник
Стандарты кодирования, с которыми я работал, были следующими для большинства объявлений классов.
Если вы используете любой из этих 6, вы просто закомментируете соответствующую строку.
Пример: класс FizzBus требует только dtor, и поэтому не использует остальные 5.
Здесь мы закомментируем только 1 и установим его реализацию где-нибудь еще (вероятно, там, где это предполагает стандарт кодирования). Другие 5 (из 6) запрещены с удалением.
Вы также можете использовать '= delete', чтобы запретить неявные рекламные акции разных размеров ... пример
источник
= delete
это функция, представленная в C ++ 11. В соответствии с=delete
этим не будет разрешено вызывать эту функцию.В деталях.
Допустим, в классе.
При вызове этой функции для назначения объекта она не разрешается. Средство назначения оператора собирается ограничить копирование из одного объекта в другой.
источник
Новый стандарт C ++ 0x. Пожалуйста, смотрите раздел 8.4.3 в рабочем проекте N3242
источник
Удаленная функция неявно встроена
(Приложение к существующим ответам)
... И удаленная функция должна быть первым объявлением функции (за исключением удаления явных специализаций шаблонов функций - удаление должно быть при первом объявлении специализации), то есть вы не можете объявить функцию, а затем удалить ее, скажем, в его определении локально для единицы перевода.
Ссылаясь на [dcl.fct.def.delete] / 4 :
Шаблон основной функции с удаленным определением может быть специализированным
Хотя общее правило заключается в том, чтобы избегать специализации шаблонов функций, поскольку специализации не участвуют в первом шаге разрешения перегрузки, существуют спорные условия, в которых это может быть полезно. Например, при использовании не перегруженного шаблона первичной функции без определения для соответствия всем типам, которые не хотелось бы неявно преобразовывать в перегрузку сопоставления путем преобразования; т.е. для неявного удаления ряда совпадений неявного преобразования путем реализации только точных совпадений типов в явной специализации неопределяемого, не перегруженного шаблона первичной функции.
До концепции удаленной функции C ++ 11 можно было сделать это, просто опуская определение шаблона первичной функции, но это давало непонятные неопределенные ссылочные ошибки, которые, вероятно, не давали никакого семантического намерения от автора шаблона первичной функции (намеренно опущено ?). Если вместо этого мы явно удалим шаблон первичной функции, сообщения об ошибках в случае, если не найдена подходящая явная специализация, станут намного приятнее, а также покажут, что пропуск / удаление определения шаблона первичной функции было преднамеренным.
Однако вместо того, чтобы просто опустить определение для шаблона первичной функции, приведенного выше, получая скрытую неопределенную ошибку ссылки, когда не найдено явной специализации, определение первичного шаблона можно удалить:
Выводит более читаемое сообщение об ошибке, в котором также четко видна цель удаления (где неопределенная ошибка ссылки может привести к тому, что разработчик посчитает эту ошибку необдуманной).
Возвращаясь к тому, почему мы бы хотели использовать эту технику? Опять же, явные специализации могут быть полезны для неявного удаления неявных преобразований.
источник
Это новая вещь в стандартах C ++ 0x, где вы можете удалить унаследованную функцию.
источник
void foo(int); template <class T> void foo(T) = delete;
останавливает все неявные преобразования.int
Принимаются только аргументы типа, все остальные будут пытаться создать экземпляр «удаленной» функции.