C++ 命名要求: UnformattedInputFunction
來自 cppreference.com
[編輯] 要求
UnformattedInputFunction 是一個流輸入函式,執行以下操作:
1) 構造一個型別為 basic_istream::sentry 的物件,該物件具有自動儲存期,並且
noskipws
引數設定為 true,執行以下操作:- 如果輸入流上設定了 eofbit 或 badbit,則同時設定 failbit;如果在此輸入流的 異常掩碼 中啟用了
failbit
上的異常 ((exceptions() & failbit) != 0),則丟擲 ios_base::failure。 - 如果適用,重新整理 tie()'d 輸出流。
2) 透過呼叫
sentry::operator bool()
檢查崗哨的狀態,這等效於 basic_ios::good。- 如果運算子返回 false 或崗哨的建構函式丟擲異常
- 將輸入流中提取的字元數 (gcount) 設定為零。
- 如果呼叫該函式是為了寫入
CharT
陣列,則將CharT()
(空字元)寫入陣列的第一個位置。
- 如果運算子返回 true,則執行輸入,如同呼叫 rdbuf()->sbumpc() 或 rdbuf()->sgetc()。
- 如果到達流的末尾(呼叫 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 返回 Traits::eof()),則設定
eofbit
。如果在此流的 異常掩碼 中啟用了eofbit
上的異常 ((exceptions() & eofbit) != 0),則丟擲 ios_base::failure。 - 如果在輸入期間丟擲異常,則在輸入流中設定
badbit
。如果在此流的 異常掩碼 中啟用了badbit
上的異常 ((exceptions() & badbit) != 0),則該異常也會被重新丟擲。
- 從 basic_ios::clear 丟擲的異常不會被捕獲或重新丟擲。
- 如果在輸入期間沒有丟擲異常,則設定輸入流中提取的字元數 (gcount)。
- 如果到達流的末尾(呼叫 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 返回 Traits::eof()),則設定
3) 無論如何,無論是因異常終止還是返回,在離開此函式之前都會呼叫崗哨的解構函式。
[編輯] 標準庫
以下標準庫函式是 UnformattedInputFunction。
- std::getline,除了它不修改 gcount。
- basic_istream::operator>>(basic_streambuf*)
- basic_istream::get
- basic_istream::getline
- basic_istream::ignore
- basic_istream::peek
- basic_istream::read
- basic_istream::readsome
- basic_istream::putback,除了它首先清除
eofbit
- basic_istream::unget,除了它首先清除
eofbit
- basic_istream::sync,除了它不修改 gcount
- basic_istream::tellg,除了它不修改 gcount
- basic_istream::seekg,除了它首先清除
eofbit
並且不修改 gcount - std::ws,除了它不修改 gcount
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 61 | C++98 | 由於以下原因丟擲異常是否會導致設定 badbit 尚不清楚:設定 eofbit 和/或 failbit 將導致設定 badbit |
從 basic_ios::clear 丟擲的異常 未被捕獲或重新丟擲 |
LWG 160 | C++98 | 確定捕獲的異常是否重新丟擲的過程 提到了一個不存在的函式 exception() |
更正為 exceptions() |
LWG 243 | C++98 | 當 sentry::operator bool() 返回 false 時的行為或崗哨物件構造失敗時的行為未指定 |
已指定 |