f 的奇怪案例;為什麼它總是在輸出中打印 1?
遇到一種特殊的行為,即調用不帶括號 (f;) 的函數並使用 std::cout 打印其結果始終產生數字 1 可能會引發問題。最初,人們可能期望程式碼會列印一個函數指針,但觀察結果表明並非如此。
深入研究下面的程式碼:
<code class="cpp">#include <iostream> using namespace std; void pr() { cout << "sth"; } int main() { pr; cout << pr; // output: 1 cout << *pr; // output: 1 cout << ≺ // output: 1 }
我們可以看到 pr;技術上並沒有呼叫 pr() 函數。相反,函數指標被傳遞給 cout。當函數指標在此過程中轉換為 bool 值時,其行為類似於非零值計算結果為 true 的邏輯表達式。列印時這會轉換為 1。
此外,在 C 11 之前的標準中,不存在允許串流函數指標的重載。這使得直接使用 std::cout 格式化和列印函數指標變得具有挑戰性。然而,隨著C 11 的出現,人們可以定義一個自訂重載來實現這一目標:
<code class="cpp">template <class RType, class ... ArgTypes> std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }
使用此重載,cout << pr 現在將列印:
<code class="text">(func_ptr=<address of pr>)(num_args=0)</code>
此自訂重載示範了列印不同數量的函數指標。雖然它緩解了函數指標的問題,但它並沒有完全解決涉及重載函數或函數模板的場景,在這些場景中指定所需的重載變得至關重要。
以上是為什麼 `std::cout的詳細內容。更多資訊請關注PHP中文網其他相關文章!