Имеет ли смысл псевдодеструктор-name для не-класса и не-enum типа?

Есть цитата из 5.2.4/1 N3797, окончательный рабочий проект C++14:

Использование псевдодеструктора-имени после точки. или стрелка -> оператор представляет деструктор для не-классового типа, обозначенного type-name или decltype-спецификатором.


Вопрос

  • Для какого типа мы можем рассмотреть pseudo-destructor-nameэто только тип enum?

2 ответа

Решение

Это только перечислимый тип?

Нет, псевдо-деструктор-вызов действителен для любого типа.


Но как насчет... этого?

enum Foo : int { ... };
typedef int Bar;

Foo a; a.~Foo ();         // (1), legal
int b; b.~Bar ();         // (2), legal
int c; c.~decltype(c) (); // (3), legal


int d; d.~int ();         // (4), ill-formed... why?

Кажется странным, что (4) плохо сформирован, все остальные законны; не намерение вызвать вызов псевдо-конструктор на int во всех случаях?

Кажется совершенно очевидным, что мы не используем спецификатор decltype ни в (3), ни (4), поэтому вопрос таков:

  • Что такое имя типа и как его определение влияет на ранее написанный фрагмент?

Определение type-name доступно по адресу [dcl.type.simple]p1 и говорит, что имя типа есть;

  • имя класса или;
  • имя-перечисления или;
  • typedef-имя или;
  • простой идентификатор шаблона.

Обратите внимание, что вышеприведенный список не включает фундаментальные типы, и именно поэтому (4) плохо сформирован, а (3) нет; даже если мы вызываем псевдо-деструктор вызов на int в обоих случаях.

int это имя типа, но это не имя типа.

Как говорится в тексте, это для всех типов, кроме классов. В тех редких случаях, когда вам необходимо явно вызвать деструктор, возможность вызова псевдо-деструктора позволяет не беспокоиться о том, является ли тип типом класса. Если это тип класса, вы вызовете реальный деструктор; это не будет псевдодеструктивный вызов. Если это не тип класса, выражение безопасно и не имеет никакого эффекта.

Другие вопросы по тегам