引用了N3797的5.2.4 / 1,C ++ 14最终工作草案:
在点后使用伪析构函数名称。或箭头 - >操作者 表示由type-name表示的非类型的析构函数 或decltype-specifier。
问题
pseudo-destructor-name
的类型,是枚举类型吗?答案 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
获得,并说类型名称是;
请注意,上面的列表不包含基本类型,这就是为什么(4)格式错误,(3)不是;即使我们在两种情况下都在int
上调用伪析构函数调用。
int
是类型的名称,但它不是类型名称。
答案 1 :(得分:0)
与文字说的一样,它适用于所有类型,但类型除外。在需要显式调用析构函数的极少数情况下,伪析构函数调用的可能性使得不必担心类型是否为类类型。如果它是一个类类型,你将调用实际的析构函数;它不会成为伪析构函数。如果它不是类类型,则表达式是安全的并且没有效果。