首頁 >後端開發 >C++ >'Timer()”是函數還是物件?理解 C 11 中的「最令人煩惱的解析」。

'Timer()”是函數還是物件?理解 C 11 中的「最令人煩惱的解析」。

Barbara Streisand
Barbara Streisand原創
2024-11-02 15:33:29762瀏覽

Is

最令人困擾的解析混亂:澄清歧義

在C 11 中,統一初始化器引入了一種微妙的歧義,稱為「最令人煩惱的解析」。讓我們深入研究一個示範此問題的範例:

<code class="cpp">#include <iostream>

class Timer {
public:
    Timer() {}
};

int main() {
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"?
    return 0;
}</code>

分析:

第一行:

<code class="cpp">auto dv = Timer();</code>
  • 第一行:
  • 第一行:
第一行:

<code class="cpp">int time_keeper(Timer());</code>
    第一行:
  • 第一行:
  • 第一行:

什麼是Timer()?
<code class="cpp">#include <type_traits>

struct Timer { };
int main() {
    int time_keeper(Timer());
    static_assert(
        std::is_same<
            decltype(time_keeper),
            int(Timer(*)())
        >::value,
        "This should not fire!");
}</code>
Timer() 是 Timer 類別的一個不帶參數的建構子。它初始化 Timer 類型的物件。

dv 是什麼型式?

dv 使用 auto 聲明,它從初始化器推斷其類型。由於初始值設定項是 Timer 類型,因此 dv 是 Timer 類型。 第二行:這是函數嗎? 是的,這是一個函數宣告。它聲明了一個名為 time_keeper 的函數,該函數傳回一個 int 並接受一個參數。 為什麼參數不是「Timer () ()」? 這是一個特殊的情況「最令人煩惱的解析」的歧義。當一個函數作為參數傳遞給另一個函數時,它會自動衰減為指向該函數的指標。因此,在這種情況下,參數不是 Timer () (),而是 Timer()。 為了證明這一點,請考慮以下程序:程式編譯成功,確認 time_keeper 將指向函數的指標作為參數。 總之,「最令人煩惱的解析」混亂源於這樣一個事實:表達式 Timer() 可以解釋為Timer 類型的物件或指向返回 Timer 的函數的函數指標。正確的解釋取決於使用該表達式的上下文。

以上是'Timer()”是函數還是物件?理解 C 11 中的「最令人煩惱的解析」。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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