gpt4 book ai didi

c++ - 虚函数 : GCC 4. 9 的宽松抛出说明符提示但 MSVC

转载 作者:行者123 更新时间:2023-11-30 02:17:20 25 4
gpt4 key购买 nike

我有原始的 C++ 11 代码,它是为 Windows 开发的,可以被 MSVC 编译:

 class Base
{
virtual void myFunc() throw (std::runtime_error) = 0;
};

class D1 : public Base
{
void myFunc() throw(std::runtime_error) override
{ //
throw std::runtime_error("This method is not supported in this class so we throw exeception");
}
};

class D2 : public D1
{
void myFunc() override
{
//real implementation here
}
};

代码移植到Linux,用GCC 4.9编译,报错

looser throw specifier for 'virtual void D2::myFunc()'

'throw()' 添加到 D2::MyFunc 可以编译代码,但它不是 MyFunc 的预期属性。
有什么方法可以让 GCC 工作吗?

最佳答案

gcc 是对的;派生类中的虚函数不能有比基类中被覆盖的函数更宽松的异常说明符。原因很清楚:如果允许这样做,调用者可以通过基类指针调用覆盖函数,因此获取函数不遵守调用它的静态类型的异常约定。

在 MSVC 上,这恰好起作用只是因为它对异常说明符的支持大大减少 - 它实际上只解析 throw(),所有其他异常说明符都被忽略。

现在,假设除了 throw()(又名 nothrow)之外的异常说明符:

  • 在 MSVC 中被忽略
  • 无论如何都会被标准弃用
  • 被广泛认为是一个错误,因为它们为您带来了几乎零编译时安全性 - 它们本质上归结为用一个大的 try 包装所有带注释的函数并调用 std: :unexpected 如果抛出任何意想不到的东西 - 甚至在 Java 风格的检查异常上,人们也广泛争论是否真的值得麻烦;

你可能应该完全放弃它们,永远不要回头看。

关于c++ - 虚函数 : GCC 4. 9 的宽松抛出说明符提示但 MSVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com