首頁  >  文章  >  後端開發  >  為什麼 `std::cout

為什麼 `std::cout

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-28 02:37:31983瀏覽

Why does `std::cout

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 << &pr; // 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn