11 Declarators [dcl.decl]

11.4 Function definitions [dcl.fct.def]

11.4.3 Deleted definitions [dcl.fct.def.delete]

Определение функции в форме:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt  = delete ;

называется а deleted definition. Функция с удаленным определением также называется функцией deleted function.

Программа, которая неявно или явно ссылается на удаленную функцию, за исключением ее объявления, плохо сформирована. [ Note: Это включает неявный или явный вызов функции и формирование указателя или указателя на член функции. Это применимо даже к ссылкам в выражениях, которые потенциально не оцениваются. Если функция перегружена, на нее ссылаются только в том случае, если функция выбрана разрешением перегрузки. Неявное odr-use выражение виртуальной функции само по себе не является ссылкой. ] end note

[ Example: Можно принудительно применить инициализацию не по умолчанию и нецелую инициализацию с помощью

struct onlydouble {
  onlydouble() = delete;                // OK, but redundant
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

end example]

[ Example: Можно предотвратить использование класса в определенных случаях new-expressions , используя удаленные определения пользователя, объявленного operator new для этого класса.

struct sometype {
  void* operator new(std::size_t) = delete;
  void* operator new[](std::size_t) = delete;
};
sometype* p = new sometype;     // error, deleted class operator new
sometype* q = new sometype[3];  // error, deleted class operator new[]

end example]

[ Example: Можно сделать класс не копируемым, то есть доступным только для перемещения, используя удаленные определения конструктора копирования и оператора присваивания копии, а затем предоставив определения по умолчанию для конструктора перемещения и оператора присваивания перемещения.

struct moveonly {
  moveonly() = default;
  moveonly(const moveonly&) = delete;
  moveonly(moveonly&&) = default;
  moveonly& operator=(const moveonly&) = delete;
  moveonly& operator=(moveonly&&) = default;
  ~moveonly() = default;
};
moveonly* p;
moveonly q(*p);                 // error, deleted copy constructor

end example]

Удаленная функция неявно является файлом inline function. [ Применяется к удаленным определениям. ] Удаленное определение функции должно быть первым объявлением функции или, для явной специализации шаблона функции, первым объявлением этой специализации. Неявно объявленная функция выделения или освобождения ( ) не должна определяться как удаленная. [Note: one-definition rule end note[basic.stc.dynamic]Example:

struct sometype {
  sometype();
};
sometype::sometype() = delete;  // ill-formed; not first declaration

end example]