Может ли какая-либо функция быть удаленной?

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

3 ответа

Решение

Спецификация C++0x (§[dcl.fct.def.delete]) не запрещает такие конструкции, и g++ 4.5 распознает все 3 из них.

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 добавит явно удаленные классы.

Из того, что я понимаю из определения "удаленных" функций-членов, является то, что оно применяется только к специальным функциям-членам (конструктор, копирование, присваивание), которые могут создаваться автоматически компилятором, а не к обычным функциям-членам (что не имеет смысла в все ИМО, чтобы объявить функции "удаленными", так что просто не объявляйте их все равно)

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