Кто-либо может функционировать быть удаленной функцией?

Рабочий проект явно вызывает это, принятые значение по умолчанию функции должны быть специальными функциями членства (например, конструктор копии, конструктор по умолчанию, и т.д., (§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;
5
задан deft_code 12 October 2010 в 16:13
поделиться

3 ответа

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

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
4
ответ дан 14 December 2019 в 19:04
поделиться

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

-3
ответ дан 14 December 2019 в 19:04
поделиться

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

= 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
ответ дан 14 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: