我有一个不抛出任何东西的成员函数,所以我在throw()
它的末尾附加了后缀,表示它不会抛出任何异常。
我的问题是,在函数中我使用了几个std::string
,让我们说在初始化时出了点问题std::string
,它抛出bad_alloc
or out_of_range
(或者 std::string 可能出现的其他问题)。
仍然添加throw()
后缀是否仍然安全?
我有一个不抛出任何东西的成员函数,所以我在throw()
它的末尾附加了后缀,表示它不会抛出任何异常。
我的问题是,在函数中我使用了几个std::string
,让我们说在初始化时出了点问题std::string
,它抛出bad_alloc
or out_of_range
(或者 std::string 可能出现的其他问题)。
仍然添加throw()
后缀是否仍然安全?
异常规范对在函数内部运行的所有代码做出了承诺,无论您是否编写了它。
如果std::string
从你的函数内部抛出,那么这个承诺就会被打破,你的程序就会失败。(std::unexpected
异常,这通常意味着您的程序很难终止)
该throw()
规范仅在以下情况下是正确的:
或者
两件事情。
首先:throw()
规范添加了一个运行时检查,该函数不会抛出异常,std::unexpected_exception
如果 promise 被破坏则调用,这将终止程序。
第二:throw()
不建议使用,并且已在 C++11 中弃用。在 C++11 中,您可以noexcept
改用(或更具延展性的形式noexcept(boolean-expression)
)。不创建运行时检查,如果函数抛出,行为是未定义的。