【问题标题】:c++ destructor return typeC++ 析构函数返回类型
【发布时间】:2019-08-08 10:09:09
【问题描述】:

析构函数是一个特殊的成员函数,它不接受参数并且没有返回类型:几乎所有的 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++ c++11 language-lawyer destructor decltype


【解决方案1】:

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

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

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

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

在点. 或箭头-&gt; 运算符之后使用pseudo-destructor-name 表示由type-name 表示的非类类型的析构函数em> 或 decltype-specifier。结果只能用作函数调用运算符() 的操作数,此类调用的结果类型为void。唯一的效果是在点或箭头之前对 postfix-expression 求值。

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

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2015-07-08
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多