如何使用隐式虚拟析构函数正确解析不兼容的抛出说明符
How to correctly resolve incompatible throw specifiers with implicit virtual destructors?
此代码不编译:
#include <QString>
/* relevant part:
struct QString
{
~QString() noexcept(false) {};
};
*/
class Base
{
public:
virtual ~Base() = default;
};
class Derived : public Base
{
QString string_;
};
int main()
{
return 0;
}
错误为:
error: looser throw specifier for 'virtual Derived::~Derived()'
error: overriding 'virtual Base::~Base() noexcept (true)'
我没有使用异常的经验,但我认为问题是QString
析构函数没有异常说明符,因此隐式创建的Derived::~Derived
也没有异常说明符。这与作为noexcept(true)
的隐式Base::~Base
不兼容。
如果我排除了QString
或将其替换为具有noexcept(true)
的类(如std::string
),则代码会编译。
起初,我认为可以通过将两个析构函数都声明为noexcept(false)
:来解决这个问题
virtual ~Base() noexcept(false) = default;
virtual ~Derived() noexcept(false) = default;
但我得到的只是:
error: function 'virtual Base::~Base()' defaulted on its first declaration
with an exception-specification that differs from
the implicit declaration 'Base::~Base()'
error: looser throw specifier for 'virtual Derived::~Derived() noexcept (false)'
error: overriding 'virtual Base::~Base() noexcept (true)'
我在代码中的任何地方都不使用异常,所以我要找的只是一个"修复"。
您似乎被指定自己在dtor中抛出的QString激怒了。
我认为没有简单的方法(除了使用一个合理的字符串):您可以随意将基类dtor指定为noexcept(false),或者使派生dtor显式并表示noexcept(true)。(我不确定如果~QString真的抛出了,是否会发生什么好事,但这会导致第一条逃生路线)。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何在C++中停止调用不兼容的方法?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++不兼容的迭代器类型
- 编译器错误"在if语句中分配不兼容的类型"
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- 如何使用隐式虚拟析构函数正确解析不兼容的抛出说明符