Деструктор должен или не должен быть объявлен с указателем?в C ++ - PullRequest
8 голосов
/ 07 сентября 2011

В C ++ 0x -n3290 Черновик: они добавлены в раздел: Деструкторы: 12,4 / 2-я точка последней строки

          **A destructor shall not be declared with a ref-qualifier.**

В c ++ 03 Draft .... они не упоминали об этом в деструкторах?

мой вопрос:

   *~S() ;   //this declaration is allowed or not according to the Standard's
   //**~S(); ***~S() ; etc...........

этот тип объявления разрешен? Нет, где в проекте он описал эту ... декларацию?

В GCC 4.6.0, Sun / Oracle C ++ 12.0, ---> это объявление разрешено int Comeau C / C ++ -> не разрешено

Ответы [ 3 ]

10 голосов
/ 07 сентября 2011

Это не похоже на то, что это когда-либо будет объявлением законной функции любого рода, тем более для деструктора.Я не уверен, о чем идет речь в этой части стандарта, но у меня есть предположение.

Я подозреваю, что есть классификатор, который говорит, что ваша функция вызывается по ссылке на rvalue.Примерно так:

class A {
 public:
   void IAmAnRValue() &&;
};

Я думаю, что язык в стандарте говорит, что этот классификатор недопустим для деструктора, очень похоже на то, что трейлинг const также будет недопустимым.* И при дальнейшем расследовании моя уверенность в правильности моей догадки значительно возрастает.Вот оправдание:

Там ясно сказано, что функции теперь могут иметьквалификатор »после« cv-qualifer ».Это означает, что за объявлением функции теперь может следовать const & или const volatile && вместо просто const.И используемый термин (ref-qualifier) ​​такой же, как термин, используемый в небольшом фрагменте стандарта, который вы цитируете.И для деструкторов имеет смысл не иметь их.

7 голосов
/ 07 сентября 2011

Вы неправильно поняли, что означает ref-qualifier в новом стандарте. Точно так же, как вы можете предоставить квалификатор const для любой функции-члена в C ++ 03, вы также можете добавить ref-квалификатор к функции-члену в C ++ 0x. Этот модификатор будет влиять на тип неявного this аргумента функции:

struct test {
   void f() const &&;  // implicit "this" in "f" is of type "test const &&"
};

Так же, как деструктор не может быть static, или const, или const volatile в C ++ 03, он не может принимать ref-квалификатор (& или &&) в C ++ 0x. Конечно, этот бит не присутствовал в прежнем стандарте.

1 голос
/ 07 сентября 2011

Правило, которое вы ищете, указано в том же параграфе, 12.4p2

Деструктор не принимает параметров, и для него нельзя указать тип возвращаемого значения (даже void).

Фраза «тип возврата не может быть указан для него» также запрещает «*», что не сразу понятно, но видно по сравнению с 12.3.2p1 (сравните с в этом отчете о проблеме ):

... Такие функции называются функциями преобразования. Тип возврата не может быть указан.

Это правило запрещает реализации * operator int() { }. Вы также можете поспорить с 12.4p1, хотя, поскольку он сформулирован очень обобщенно и является первым утверждением в разделе деструкторов, я думаю, что другое утверждение выше должно быть основным аргументом

Специальный синтаксис объявления с использованием необязательного спецификатора функции (7.1.2), за которым следует ˜, за которым следует имя класса деструктора, за которым следует пустой список параметров, используется для объявления деструктора в определении класса.

Как видно / прочитано, в этом описании нет упоминаний о таких деклараторах, как *, в которых указаны намерения авторов.

...