考慮以下代碼片段:
std::stringstream ss;
ss << "hello world!\n";
auto a = ss.rdbuf();
std::cout << a; // prints out "hello world!
該變數a是指向型別物件的指標std::stringbuf。當它被傳遞給流輸出運算子<<時,使用 GCC9.4,a將列印出指向的流緩沖區的內容。
我的問題是:這種行為只是std::stringbuf在 GCC 中實作方式的意外,還是語言標準保證這將始終有效?
uj5u.com熱心網友回復:
Astd::basic_stringbuf派生自std::basic_streambuf。Cppreference 描述了它的使用:
I/O 流物件
std::basic_istream和std::basic_ostream以及從它們派生的所有物件(std::ofstream、std::stringstream等)完全根據std::basic_streambuf.
這意味著什么?好吧,讓我們看看std::basic_istream::operator<< 這里的多載集:
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb );(10)
表現為
UnformattedOutputFunction. 在構造并檢查哨兵物件后,檢查是否sb為空指標。如果是,則執行setstate(badbit)并退出。否則,從由 控制的輸入序列中提取字符sb并將它們插入,*this直到滿足以下條件之一:
- 檔案結束出現在輸入序列上;
- 在輸出序列中插入失敗(在這種情況下,不提取要插入的字符);
- 發生例外(在這種情況下捕獲例外)。
如果沒有插入字符,則執行
setstate(failbit). 如果在提取時引發例外,則設定failbit,如果failbit設定在 中exceptions(),則重新引發例外。
所以,是的,標準保證std::cout << ss.rdbuf();會產生您觀察到的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/477976.html
上一篇:逐步擦除串列元素
