【问题标题】:Does pseudo-destructor-name make a sense for non-class and non-enum type?伪析构函数名称对非类和非枚举类型有意义吗?
【发布时间】:2014-07-22 21:47:32
【问题描述】:

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

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


问题

  • 对于什么类型我们可以考虑pseudo-destructor-name,是不是只有enum-type

【问题讨论】:

标签: c++ language-lawyer


【解决方案1】:

是否只有枚举类型

不,pseudo-destructor-callany 类型有效。


但是,这个……这个呢?

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,它的定义如何影响之前写的sn-p?

type-name 的定义可在 [dcl.type.simple]p1 获得,并表示 type-name 是;

  • 一个类名,或者;
  • 一个枚举名称,或者;
  • 一个typedef-name,或者;
  • 一个simple-template-id

请注意,上面的列表不包括 基本类型,这就是为什么 (4) 格式不正确,而 (3) 不是;即使我们在这两种情况下都在 int 上调用 pseudo-destructor-call

int 是一个类型的名称,但它不是一个type-name

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多