GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?

GCC 9.1 returns void& as result type for an explicit destructor call. Is this a bug?

本文关键字:类型 错误 一个 结果 void 返回 函数调用 析构 GCC      更新时间:2023-10-16

我正在尝试获得此级别定义的检查工作,这取决于decltype(std::declval<Foo>().~Foo())是CC_1如果Foo具有destructor(如果已定义,则它具有destructor(…(否则不明显,在这种情况下调用Sfinae。

但是,我无法获得与GCC 9.1一起使用的代码,这是因为GCC 9.1似乎认为该类型为void & 如果destructor默认为,请考虑以下示例:

#include <type_traits>
class Foo {
public:
// With this, the DestructorReturnType below becomes "void"
//    ~Foo () {} 
};
// … unless I specify the user-defined destructor above, in which case it is "void"
using DestructorReturnType = decltype(std::declval<Foo>().~Foo());
template<class T>
class TD;
// Says: aggregate 'TD<void&> t' has incomplete type and cannot be defined
TD<DestructorReturnType> t;

(可在https://gcc.godbolt.org/z/k1tjop上找到(

如果我用户定义了一个空的破坏者,则类型会跳回void。另外,如果我切换回GCC 8.x。

[expr.call]中的C 17标准状态:

如果后缩 - 表达式指定了驱动器,则函数调用表达式的类型是无效的。[…]

由于所有这些,我怀疑GCC 8.X(和Clang,…(是正确的,而GCC 9.1是错误的。还是我错过了什么?

长话短说:是的,这是GCC 9.1中的回归。void&甚至都不是有效的类型,因此有些错误。同时,可以通过(可能的,轻微的(绩效费用设置-fno-lifetime-dse编译器选项来解决问题。另外,在9.1之前的海湾合作委员会版本不受影响。

如果您找到了此答案,因为您还试图实现上面的IS级定义检查,我认为使用sizeOf的更简单的表格应明确定义,可以工作,并且不会被此错误击中。/p>