檔案std::basic_ostream<CharT,Traits>::write說[強調我的]:
表現為 UnformattedOutputFunction。構造并檢查哨兵物件后,從字符陣列中第一個元素由 s 指向的連續位置輸出字符。字符被插入到輸出序列中,直到發生以下情況之一:
插入精確計數的字符
插入輸出序列失敗(在這種情況下呼叫 setstate(badbit))
我如何理解粗體的陳述?這個所謂的“哨兵物件”是什么?
據我所知,當std::basic_ostream<CharT,Traits>被呼叫時,必須已經存在一個型別為std::basic_ostream.
例如:
#include<iostream>
int main
{
std::string str{"thanks for your attention to this matter"};
std::cout.write(str.data(), str.length());
}
注意:std::cout的型別是std::ostream并且std::ostream被定義為typedef std::ostream std::basic_ostream<char>。
uj5u.com熱心網友回復:
如果您按照您參考的文本中的UnformattedOutputFunction鏈接,您會發現哨兵是什么以及它的作用的以下描述:
UnformattedOutputFunction是一個流輸出函式,它執行以下操作:
構造一個
basic_ostream::sentry具有自動存盤持續時間的型別的物件,它執行以下操作
- 如果在輸出流上設定了
eofbitorbadbit,也設定了failbit,如果failbit在此輸出流的例外掩碼中啟用了例外 on ,則 throwsios_base::failure。- 如果適用,重繪
tie()'d 輸出流。通過呼叫來檢查哨兵的狀態,
sentry::operator bool()相當于basic_ios::good。如果哨兵回傳
false或哨兵的建構式拋出例外,則不會輸出如果哨兵回傳
true,則嘗試通過將字符插入輸出流來執行所需的輸出,就像呼叫rdbuf()->sputc()or一樣rdbuf()->xsputn()。此外,rdbuf()->overflow()和rdbuf()->sync()可以被呼叫,但不能呼叫 的其他虛擬成員函式std::basic_streambuf。
- 如果在輸出期間拋出例外,則
badbit在輸出流中設定。如果badbit在此流的例外掩碼中啟用了例外,也會重新拋出例外。- 如果沒有拋出例外,則回傳函式指定的值。
在任何情況下,無論是例外終止還是回傳,哨兵的解構式都會在離開這個函式之前被呼叫。
此外,FormattedOutputFunction (ie operator<<) 的檔案對其使用sentry.
因此,基本上,每個輸出方法在執行輸出作業之前都會ostream構造一個嵌套類的實體。確保處于有效狀態以接受輸出資料ostream::sentry。如果不是,則將其置于失敗狀態,并在需要時拋出例外。sentryostreamostream
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493776.html
標籤:C
