c ++析构函数返回类型

问题描述 投票:5回答:1

析构函数是一个特殊的成员函数,它不带参数,也没有返回类型:几乎所有的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(...);
  };

Gnu g ++会显示带有typeid void的_U,所以析构函数会返回一个类型吗?专家请解释一下c ++标准对此的说法。

c++ c++11 language-lawyer destructor decltype
1个回答
12
投票

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

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

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

这不适用的是伪析构函数调用,在[expr.pseudo](伪析构函数调用)中描述,它声明如下:

在点.或箭头->运算符之后使用伪析构函数名称表示由type-name或decltype-specifier表示的非类型类型的析构函数。结果只能用作函数调用运算符()的操作数,并且这种调用的结果具有类型void。唯一的效果是在点或箭头之前评估后缀表达式。

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

© www.soinside.com 2019 - 2024. All rights reserved.