Может ли любая функция быть удаленной функцией?
-
03-10-2019 - |
Вопрос
Рабочий проект явно вызывает, что по умолчанию-функциям Должен быть специальные функции элементов (например, Copy-Constructor, Contractor по умолчанию и т. Д. (§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;
Решение
SC ++ 0x SPEC (§ [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 добавляет явные удаленные классы.
Из того, что я понимаю из определения «удаленных» функций-членов, заключается в том, что он применяется только к специальным функциям-членам (конструктор, копирование, назначение), которые могут быть созданы автоматически компилятором, а не для обычных функций участника (что не имеет смысла в Все IMO, объявить функции, чтобы быть «удален», поэтому просто не объявляю их в любом случае)