为什么std::runtime_error::what()
会返回const char*
而不是std::string const&
?
在许多情况下,直接返回对嵌入字符串的引用会很方便,并且可以避免一些开销。那么不返回的理由是什么?首先是对内部字符串的const引用而不是提供重载函数?我想它也跟着一个字符串ctor也可以抛出异常,但是我没有看到返回字符串引用的风险。
答案 0 :(得分:5)
std::runtime_error
继承自定义std::exception
的{{1}},因此最简单的响应是它是函数的重载,并且您可以确定任何标准异常都以这种方式定义它。它可以(取决于实现)返回virtual const char* what() const throw();
,但它与标准库的其余部分不一致。
我认为std::string
返回what()
的原因是你可以避免任何可能失败的操作(尤其是可以抛出异常)。请考虑以下代码,该代码不应失败
const char*
但是在以下代码中,virtual const char* what() const throw() {
return "An error has occured";
}
的分配可能会失败,抛出异常:
std::string
如果字符串的构造函数在这里抛出,那么应用程序很可能会崩溃,无论如何,因为函数指定了std::string what() const throw() {
return std::string("An error has occured");
}
。
在异常中使用throw()
会引入分配内存的需要,这可能是不可能的(请注意std::string
也继承自std::bad_alloc
)。
答案 1 :(得分:4)
不一定是嵌入式std::string
。 what
成员函数是虚拟的,即它被设计为被覆盖。覆盖它的主要原因是通过std::runtime_error
使用的机制以某种其他方式提供字符串(无论该机制是什么,最有可能是存储的std::string
)。
答案 2 :(得分:1)
虽然runtime_error确实将std :: string作为参数,因此它可以保留它并按照你的建议返回它,what()方法继承自std :: exception,因此更为通用。
抛出异常的开销很可能已经很高,堆栈展开,所以你不应该担心这一点额外的开销。