為什麼 stringstream >> C 11 之後擷取失敗時會改變目標值?
Stroustrup 的「TC PL」指出,如果 istream 或 ostream 操作失敗,目標變數的值應保持不變。然而,這與使用 stringstream 觀察到的行為相矛盾:
#include <iostream> #include <sstream> int main() { std::stringstream ss; int v = 123; ss << "The quick brown fox."; if (ss >> v) { std::cout << "Unexpected success in reading a word into an int!\n"; } std::cout << "After extraction failure: " << v << "\n"; return 1; }
儘管 Stroustrup 聲稱,此程式碼列印「提取失敗後:0」。
C 11 行為修改
這個矛盾源自於 C 11 之後 stringstream 行為的改變。在 C 11 之前, stringstream 使用 scanf 風格的解析方法,失敗時保持目標值不變。然而,從 C 11 開始,它採用了 std::strtoll,它將零寫入值變數並在提取失敗時設定故障位元。
此變更與修訂後的 C 11 istream 和 ostream 操作行為一致:
結論
雖然Stroustrup 的引用準確地描述了C 11 之前的istream 和ostream 操作的行為,但stringstream 的後C由於採用了不同的提取機制,11 行為偏離了此描述。在 C 11 及更高版本中,使用 stringstream 操作時必須注意這種改變的行為。
以上是為什麼在 C 11 及更高版本中「stringstream」會在提取失敗時修改目標變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!