C++中的Looser Throw Specifier

13

这个错误是什么意思?我该如何解决它?这是导致它的头部代码:

class BadJumbleException : public exception {
public:
    BadJumbleException (const string& msg); // Constructor, accepts a string as the message
    string& what();                         // Returns the message string
private:
    string message;                         // Stores the exception message
};

这是源代码:

BadJumbleException::BadJumbleException (const string& m) : message(m) {}
string& BadJumbleException::what() { return message; }

编辑:这是错误:

'virtual BadJumbleException::~BadJumbleException()' 的 throw specifier 更宽松了


1
你发布了错误吗? - nwalsh
1
需要声明什么才不会抛出任何异常。 - Flexo
@Flexo 你的意思是什么? - user2824889
7
我认为编译器的意思是throw修饰符只适用于失败者。 - Ivan Aksamentov - Drop
显示剩余2条评论
1个回答

29

按照C++03的规定,在 §18.6.1/5 中,std::exception有一个被声明为无法抛出异常的析构函数(否则会导致编译错误)。

因此,当您从这种类型派生时,您自己的析构函数必须具有相同的限制:

virtual BadJumbleException::~BadJumbleException() throw() {}
//                                                ^^^^^^^

这是因为覆盖函数可能没有更严格的throw说明。


在C++11中,std::exception::~exception在库代码中没有明确标记throw()(或者noexcept),但所有的析构函数默认都是noexcept(true)

由于该规则将包括您的析构函数并允许程序编译,这使我得出结论,您实际上并没有以C++11编译。


3
简而言之,如何修复此错误?为什么这段代码在其他一些项目中可以运行,但是在这个项目中却不行? - user2824889
顺便问一下,throw()在析构函数上有什么意义呢?毕竟在析构函数中无论如何都不能抛出异常... - Matteo Italia
@MatteoItalia:在C++03中,是的,你可以这样做。它会在运行时终止程序。因此,throw()可以防止您首先陷入这个噩梦。因此,C++11完全解决了这个问题。 - Lightness Races in Orbit
@user2824889:我不理解你的问题。因为我对你的“其他项目”一无所知,所以无法回答它。 - Lightness Races in Orbit
@MatteoItalia:你可以这样做,并且有很好的使用案例。你不能拥有一个在异常展开期间执行并抛出异常的析构函数。评论不是长描述的正确空间,但实际上确实存在使用案例 :) - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接