![](/img/trans.png)
[英]Does it make sense to add final keyword to the virtual function in a class that has no base class (is not derived)
[英]Sanity check: Does returning !EOF from streambuf-derived class' overflow function make sense?
關於重寫的 std::streambuf::overflow function 應該如何簡單地獲取寫入 stream 的每個字符,我幾乎找不到有用的信息。所以我向 ChatGPT 詢問了一些指示。 它不斷回到這個概念:
int overflow(int c)
{
if (c == EOF)
{
// Flush the buffer here
return !EOF;
}
// Put c in the buffer here
if (c == '\n')
{
// Flush the buffer here
}
return c;
}
當 c 是EOF
時,它返回!EOF
真是太奇怪了。
文檔沒有詳細說明“成功”的含義。
This page說它應該返回EOF
(不是!EOF
)當以EOF
作為參數調用時(或發出“失敗”信號時)。
所以:我懷疑在這里返回!EOF
是錯誤的並且我應該返回EOF
是否正確?
如果您能告訴我 ChatGPT 從哪里得到這個想法,請使用 Cookie 點數。 我找不到return;EOF;
inte.net 上的任何其他地方。
這是 C++ 標准對返回值的描述:
[streambuf.virt.put]
int_type overflow(int_type c = traits::eof());
6返回:
traits::eof()
或如果 function 失敗則拋出異常。
否則,返回traits::eof()
以外的一些值以指示成功。(304)(腳注 304)通常,
overflow
返回c
以指示成功,除非traits::eq_int_type(c, traits::eof())
返回true
,在這種情況下它返回traits::not_eof(c)
。
因此,具體的返回值並不重要,重要的是它是否為traits::eof()
。 您可能想要遵循一個(非規范的)約定。
回復:“成功”是什么意思:
[streambuf.virt.put]/5要求:此虛擬 function 的每個覆蓋定義都應遵守以下約束:
...
- 令
r
為待處理序列中未消耗的字符數。 如果r
為非零值,則應設置 pbase(pbase()
和pptr()
以便:pptr() - pbase() == r
並且從 pbasepbase()
開始的r
字符是關聯的 output stream。如果r
全部為零(待處理序列的字符已被消耗)然后將pbase()
設置為nullptr
,或者 pbase(pbase()
和pptr()
都設置為相同的非空值。- 如果向關聯的 output stream 附加一些字符失敗,或者無法根據上述規則建立 pbase(
pbase()
和pptr()
,則 function 可能會失敗。
因此,如果 function 無法實際寫入底層介質,或者無法恢復不變量,則會失敗。 如果它管理兩者,它就會成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.