類內初始化器中的歧義預防
為什麼類內初始化器僅限於用大號括號括起來或使用賦值運算子( =)?與可以使用括號的方法宣告不同,類別內初始化程序必須遵守此特定語法。
限制的基本原理
此限制旨在規避潛在的語法含糊不清。考慮以下類別定義:
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中文網其他相關文章!