Рабочий проект явно вызывает это, принятые значение по умолчанию функции должны быть специальными функциями членства (например, конструктор копии, конструктор по умолчанию, и т.д., (§8.4.2.1-1)). Который имеет смысл.
Однако я не вижу никакого подобного ограничения на удаленные функции (§8.4.3). Это правильно?
Или другими словами эти три допустимые примера c++0
?
struct Foo
{
// 1
int bar( int ) = delete;
};
// 2
int baz( int ) = delete;
template< typename T >
int boo( T t );
// 3
template<>
int boo<int>(int t) = delete;
Спецификация C ++ 0x (§ [dcl.fct.def.delete]) не запрещает такие конструкции, а g ++ 4.5 распознает все три из них.
x.cpp: In function 'int main()':
x.cpp:4:8: error: deleted function 'int Foo::bar(int)'
x.cpp:21:11: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:2: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:8: error: used here
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]'
x.cpp:23:7: error: used here
Из определения «удаленных» функций-членов я понимаю, что они применяются только к специальным функциям-членам (конструктор, копирование, присваивание), которые могут быть созданы автоматически компилятором, а не к обычным функциям-членам (что делает ИМО вообще нет смысла объявлять функции «удаляемыми», так что просто не объявляйте их в любом случае)
Я думаю, что все в порядке.
= delete
подходит для обеспечения того, чтобы перегрузка не использовалась (§8.4.3 / 2), что полезно вне классов.
Сейчас, 5 месяцев спустя, я смотрю на другие ответы… delete
полезен не только для функций с неявными определениями. Это чистая альтернатива комментарию «нет реализации - использование этого является ошибкой компоновщика». Он предоставляет явный способ не реализовывать что-либо, например, базовый шаблон, в котором фактически будут существовать только явные специализации. Компилятор пожалуется до времени компоновки.
В качестве немного странного, но вполне разумного примера рассмотрим
class abc {
protected:
inline virtual ~abc() = 0;
inline virtual void do_something() = 0;
};
abc::~abc() {}
void abc::do_something = delete;
Оба = 0
и = delete
могут использоваться в одной и той же функции. Без = delete
пользователь может случайно позвонить в службу поддержки abc :: do_something ()
.
Я не удивлюсь, если следующая итерация C ++ после C ++ 0x добавит явно удаленные классы.