GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
GCC 9.1 returns void& as result type for an explicit destructor call. Is this a bug?
我正在尝试获得此级别定义的检查工作,这取决于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>
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误