首頁 > 後端開發 > C++ > 為什麼類別內初始化器僅限於花括號或賦值運算子?

為什麼類別內初始化器僅限於花括號或賦值運算子?

DDD
發布: 2024-12-21 06:43:14
原創
457 人瀏覽過

Why Are In-Class Initializers Restricted to Curly Braces or the Assignment Operator?

類內初始化器中的歧義預防

為什麼類內初始化器僅限於用大號括號括起來或使用賦值運算子( =)?與可以使用括號的方法宣告不同,類別內初始化程序必須遵守此特定語法。

限制的基本原理

此限制旨在規避潛在的語法含糊不清。考慮以下類別定義:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Strange but legal data member

    int confusing(Overloaded); // Function declaration or data member initialization?
};
登入後複製

如果類別內初始值設定項允許使用括號,則此程式碼將導致歧義。一方面,「int fusion(Overloaded);」行可以解釋為接受 Overloaded 類型的參數並傳回 int 的函數宣告。另一方面,它也可以被讀取為具有重載資料成員的值的 int 類型的資料成員初始化。 (這與臭名昭著的「最令人煩惱的解析」問題有關。)

用大括號消除歧義

強制使用大括號,可以消除這種歧義:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Strange but legal data member

    int confusing{Overloaded}; // Clearly a data member initialization
};
登入後複製

現在很明顯,混淆是一個明確的int初始化為Overloaded的值,因為沒有範圍將其解釋為函數聲明。

此語法限制確保類別定義清晰明確,防止因語法混亂而產生意外後果。

以上是為什麼類別內初始化器僅限於花括號或賦值運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板