伪destructor-name对非类和非枚举类型有意义吗?

Does pseudo-destructor-name make a sense for non-class and non-enum type?

本文关键字:有意义 类型 枚举 destructor-name      更新时间:2023-10-16

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

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


  • 对于什么类型我们可以考虑pseudo-destructor-name,它是enum类型的吗?

是否仅为enum类型 ?

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


但是……这个吗?

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上调用伪构造函数调用的意图不是吗?

很明显,我们没有在(3)(4)中使用类型说明符,所以问题是:

    什么是类型名,它的定义如何影响前面编写的代码片段?

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

  • a 类名或;
  • an enum-name或;
  • a typedefine -name或;
  • simple-template-id

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

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

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