首頁 > 後端開發 > C++ > 主體

為什麼不能使用直接初始化語法在 C 中初始化類別資料成員?

Linda Hamilton
發布: 2024-11-17 16:10:02
原創
245 人瀏覽過

Why can't I initialize class data members in C   using direct initialization syntax?

為什麼在C 語言中禁止使用直接語法初始化類別資料成員

程式設計師可能想知道為什麼類別資料成員不能使用直接初始化語法賦值,類似於本地初始化語法變數可以。考慮以下範例:

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 標準建議只允許以下形式的初始值設定項:

    = initializer-clause
  • {initializer-list }
這解決了大多數情況下的歧義,避免了需要額外的規則。

總而言之,禁止C 中類別資料成員的直接初始化語法源自於解析涉及資料成員和函數宣告的複雜資料結構期間可能出現的歧義或具有相似簽章的型別定義。

以上是為什麼不能使用直接初始化語法在 C 中初始化類別資料成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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