伪析构函数名称对非类和非枚举类型有意义吗?

2 c++ language-lawyer

引用了N3797的 5.2.4/1 ,C++ 14最终工作草案:

在点之后使用伪析构函数名称.或箭头 - >运算符表示由type-name或decltype-specifier表示的非类型的析构函数.


  • 对于我们可以考虑的类型pseudo-destructor-name,它只是枚举类型吗?

Fil*_*efp 6

它只是枚举类型吗?

不,伪析构函数调用任何类型上都有效.


但是,这个怎么样?

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?
Run Code Online (Sandbox Code Playgroud)

似乎很奇怪(4)是不正确的,其他所有都是合法的; 是不是调用的意图伪构造函数调用int在所有情况下?

很明显我们在(3)(4)中都没有使用decltype-specifier,所以问题是:

  • 什么是类型名称,其定义如何影响以前编写的代码段?

类型名称的定义可以在[dcl.type.simple]p1,并且表示类型名称是;

  • 一个类名,或;
  • 一个枚举名称,或;
  • 一个typedef-name,或;
  • 一个简单的模板ID.

请注意,上面的列表不包括基本类型,这就是为什么(4)不正确,(3)不是; 即使我们调用伪析构函数调用上的int两种情况.

int是类型的名称,但它不是类型名称.