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

StackOverflow https://stackoverflow.com/questions/2875333

  •  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, объявить функции, чтобы быть «удален», поэтому просто не объявляю их в любом случае)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top