程式設計師可能想知道為什麼類別資料成員不能使用直接初始化語法賦值,類似於本地初始化語法變數可以。考慮以下範例:
class test { public: void fun() { int a(3); std::cout << a << '\n'; } private: int s(3); // Compiler error: Why??? };
編譯此程式碼時,會出現錯誤:
11 9 [Error] expected identifier before numeric constant 11 9 [Error] expected ',' or '...' before numeric constant為什麼會出現這種情況?讓我們回顧一下 C 標準對類別資料成員初始化的立場。 解析歧義直接初始化語法的早期提案解釋說,它被排除是為了防止解析問題。例如,考慮以下程式碼:
struct S { int i(x); // data member with initializer // ... static int x; }; struct T { int i(x); // member function declaration // ... typedef int x; };如果允許直接初始化,則解析 struct S 的聲明將變得不明確。編譯器可以解釋 int i(x);作為帶有初始值設定項的資料成員或帶有參數的成員函數宣告。 現有解析規則一種解決方案是依賴以下規則:如果聲明可以解釋為物件和函數,則應視為函數。然而,區塊作用域聲明已經存在此規則,導致潛在的混亂:
struct S { int i(j); // ill-formed...parsed as a member function, // type j looked up but not found // ... static int j; };另一個解決方案是使用以下規則:如果聲明可以解釋為類型和其他內容,則它應該被視為後者。同樣,模板已經存在此規則:
struct S { int i(x); // unabmiguously a data member int j(typename y); // unabmiguously a member function };但是,這兩種解決方案都引入了容易產生誤解的微妙之處。 建議的解 為了解決這些歧義,C 標準建議只允許以下形式的初始值設定項:
以上是為什麼不能使用直接初始化語法在 C 中初始化類別資料成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!