首頁  >  文章  >  後端開發  >  `Timer()` 是建構函式呼叫還是函式呼叫? C 語言中「最令人煩惱的解析」歧義

`Timer()` 是建構函式呼叫還是函式呼叫? C 語言中「最令人煩惱的解析」歧義

Susan Sarandon
Susan Sarandon原創
2024-11-02 13:25:30854瀏覽

Is `Timer()` a Constructor Call or a Function Call? The

「最令人困擾的解析」歧義:解開統一初始化器

在C 領域,可能會出現「最令人煩惱的解析」歧義當遇到統一初始化器時,如下例所示程式碼:

<code class="cpp">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>

解釋dv

在auto dv = Timer();行中,dv 的類型取決於Timer() 的解釋。這可以是:

  • 建構子調用,實例化 Timer 類型的物件。
  • 對 Timer 中假設的 operator() 重載的函數調用,因為可以使用統一初始化調用函數。

在這種情況下,它表示建構函式調用,導致 dv 是類型的物件計時器。 auto 關鍵字根據初始值設定項目推斷類型。

理解 time_keeper

在 int time_keeper(Timer()); 行中,宣告了一個名為 time_keeper 的函數。正如人們所期望的那樣,該參數不是 Timer (*) () 類型的函數指標。相反,它表示一個指向返回 Timer 且不帶參數的函數的指標。這是因為:

  • 當作為參數傳遞時,函數隱式衰減為指向函數的指標。
  • 在此特定實例中,函數呼叫衰減為指向傳回 a 的函數的指標。 Timer 且不帶任何參數,即 Timer(*)()。

In結論

「最令人煩惱的解析」歧義凸顯了在解釋 C 中的某些結構時可能會出現混亂。理解統一初始化和函數衰減的概念對於正確理解此類場景至關重要。

以上是`Timer()` 是建構函式呼叫還是函式呼叫? C 語言中「最令人煩惱的解析」歧義的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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