Может ли какая-либо функция быть удаленной?
В рабочем проекте явно указывается, что функции по умолчанию должны быть специальными функциями-членами (например, конструктор копирования, конструктор по умолчанию и т. Д. (§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 добавит явно удаленные классы.
Из того, что я понимаю из определения "удаленных" функций-членов, является то, что оно применяется только к специальным функциям-членам (конструктор, копирование, присваивание), которые могут создаваться автоматически компилятором, а не к обычным функциям-членам (что не имеет смысла в все ИМО, чтобы объявить функции "удаленными", так что просто не объявляйте их все равно)