[英]Why does std::runtime_error::what() return const char* instead of std::string const&
為什么std::runtime_error::what()
返回const char*
而不是std::string const&
? 在許多情況下,直接返回對嵌入字符串的引用會很方便,並且可以避免一些開銷。 那么,首先不返回例如對內部字符串的const引用而不提供重載函數的理由是什么? 我想它也跟着一個字符串ctor也可以拋出一個異常,但是我沒有看到返回一個字符串引用的風險。
std::runtime_error
繼承自std::exception
,它定義了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
繼承自std::exception
)。
不一定是嵌入的std::string
。 what
成員函數是虛擬的,即它被設計為被覆蓋。 覆蓋它的主要原因是通過std::runtime_error
使用的機制以某種其他方式提供字符串(無論該機制是什么,最可能是存儲的std::string
)。
雖然runtime_error確實將std :: string作為參數,因此它可以保留它並按照您的建議返回它,what()方法繼承自std :: exception,因此更為通用。
拋出異常的開銷很可能已經很高,堆棧展開,所以你不應該擔心這一點額外的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.