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