为什么std :: runtime_error :: what()返回const char *而不是std :: string const&

时间:2012-07-21 17:40:45

标签: c++ string exception

为什么std::runtime_error::what()会返回const char*而不是std::string const&? 在许多情况下,直接返回对嵌入字符串的引用会很方便,并且可以避免一些开销。那么不返回的理由是什么?首先是对内部字符串的const引用而不是提供重载函数?我想它也跟着一个字符串ctor也可以抛出异常,但是我没有看到返回字符串引用的风险。

3 个答案:

答案 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::stringwhat成员函数是虚拟的,即它被设计为被覆盖。覆盖它的主要原因是通过std::runtime_error使用的机制以某种其他方式提供字符串(无论该机制是什么,最有可能是存储的std::string)。

答案 2 :(得分:1)

虽然runtime_error确实将std :: string作为参数,因此它可以保留它并按照你的建议返回它,what()方法继承自std :: exception,因此更为通用。

抛出异常的开销很可能已经很高,堆栈展开,所以你不应该担心这一点额外的开销。