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

时间:2014-06-02 17:38:58

标签: c++ language-lawyer

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

  

在点后使用伪析构函数名称。或箭头 - >操作者   表示由type-name表示的非类型的析构函数   或decltype-specifier。


问题

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

2 个答案:

答案 0 :(得分: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?

似乎很奇怪(4)是不正确的,其他所有都是合法的;在所有情况下都不打算在int上调用 psuedo-constructor-call

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

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

type-name 的定义可在[dcl.type.simple]p1获得,并说类型名称是;

  • a class-name 或;
  • 枚举名称,或;
  • typedef-name 或;
  • a simple-template-id

请注意,上面的列表不包含基本类型,这就是为什么(4)格式错误,(3)不是;即使我们在两种情况下都在int上调用伪析构函数调用

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

答案 1 :(得分:0)

与文字说的一样,它适用于所有类型,但类型除外。在需要显式调用析构函数的极少数情况下,伪析构函数调用的可能性使得不必担心类型是否为类类型。如果它是一个类类型,你将调用实际的析构函数;它不会成为伪析构函数。如果它不是类类型,则表达式是安全的并且没有效果。