首頁 >後端開發 >C++ >最令人煩惱的解析是什麼以及為什麼它會發生在 C 11 中?

最令人煩惱的解析是什麼以及為什麼它會發生在 C 11 中?

Barbara Streisand
Barbara Streisand原創
2024-11-01 10:55:30856瀏覽

What's the Most Vexing Parse and Why Does It Happen in C  11?

理解統一初始化器和最令人煩惱的解析

在C 11 中,統一初始化器為初始化物件和資料結構提供了簡潔的語法。然而,它們的使用可能會導致潛在的歧義,稱為「最令人煩惱的解析」。

最令人煩惱的解析

考慮以下代碼snippet:

<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>

分析:

dv = Timer();

  • Timer() 可以解釋為函數呼叫或物件建構。
  • 因為 auto用來宣告 dv,它的型別是從右邊的表達式推導出來的。
  • 如果 Timer() 被解釋為函數調用,則 dv 將是 int,因為 Timer() 不是傳回一個物件的函數。
  • 但是,如果Timer() 被解釋為物件構造,則dv 將是一個Timer

int time_keeper(Timer());

int time_keeper(Timer());
  • Timer() 被解釋為建立一個臨時Timer 物件。
  • time_keeper 的參數是一個指向函數的指針,該函數返回一個 Timer 並且不接受
  • 作為參數傳遞時,函數會隱式轉換為指針。
因此,time_keeper 的型別為 int(Timer(*)())。

結論:

在「最令人煩惱的解析」中在這種情況下,編譯器嘗試根據上下文和規則推斷表達式的類型和解釋。透過了解這些規則如何應用,程式設計師可以避免歧義並以明確的意圖編寫程式碼。

以上是最令人煩惱的解析是什麼以及為什麼它會發生在 C 11 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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