簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM