Может ли какая-либо функция быть удаленной? - PullRequest
5 голосов
/ 20 мая 2010

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

4 голосов
/ 20 мая 2010

Я думаю, что они все в порядке.

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

4 голосов
/ 20 мая 2010

Спецификация C ++ 0x (& sect; [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
0 голосов
/ 20 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...