C ++析构函数返回类型

Bil*_*ill 5 c++ destructor decltype language-lawyer c++11

析构函数是一个特殊的成员函数,不带任何参数且没有返回类型:几乎所有c ++书籍都讲述了这一点。但是,在libstd ++库中,它使用以下内容测试类型是否可破坏,

  struct __do_is_destructible_impl
  {
    template<typename _Tp, typename _U = decltype(declval<_Tp&>().~_Tp())>
      static true_type __test(int);

    template<typename>
      static false_type __test(...);
  };
Run Code Online (Sandbox Code Playgroud)

Gnu g ++将显示_U且typeid为void,因此,析构函数是否返回类型?专家请解释一下c ++标准对此的看法。

Ben*_*igt 12

请注意,您正在考虑的代码正在检查显式析构函数调用表达式的返回类型。这对析构函数本身的返回类型没有任何意义。

显式的析构函数调用表达式可以是函数调用表达式(也可以不是)(如果类型是带有析构函数的类,则类型不是琐碎的破坏,因为它是非类类型,则不是)。描述了函数调用,[expr.call]其中对于显式析构函数调用具有以下特殊规则:

如果postfix-expression指定析构函数,则函数调用表达式的类型为void ;。否则,即使实际调用的函数类型不同,函数调用表达式的类型也就是静态选择的函数的返回类型(即忽略virtual关键字)。此返回类型应为对象类型,引用类型或。cv void

不适用于伪析构函数调用(在[expr.pseudo]Pseudo destructor call)中进行了描述),该声明如下:

在点或箭头运算符之后使用伪析构函数名称表示由type-namedecltype-specifier表示的非类类型的析构函数。结果应仅用作函数调用运算符的操作数,并且此类调用的结果为type。唯一的效果是对点或箭头之前的后缀表达式的求值。.->()void

如您所见,在任何情况下都没有达到使函数返回类型和函数调用表达式类型相同的子句。因此,void即使(特殊成员)函数根本没有返回类型,表达式也具有类型。