簡體   English   中英

我可以初始化靜態 const 類成員嗎?

[英]Can I initialize static const class member?

我想運行這個代碼:

struct A {
    static const string d[] = {"1", "2"};    
};

並得到一個錯誤:

error: in-class initialization of static data member ‘const string A::d []’ of incomplete type
     static const string d[] = {"1", "2"};
                         ^
error: non-constant in-class initialization invalid for non-inline static member ‘A::d’
     static const string d[] = {"1", "2"};
                                        ^
note: (an out of class initialization is required)

在這里,我找到了現在可以初始化所需內容的信息。 那么問題是什么?

如果我添加inline那么它將起作用:

struct A {
    static const inline string d[] = {"1", "2"};    
};

UPD:我知道解決方法,但為什么 c++ 會這樣工作?

正如您所注意到的,您可以使用inline或以下內容:

struct A {
    static const string d[];    
};

const string A::d[] = {"1", "2"};

在專用編譯單元中(僅一次)。

現場演示

該標准明確規定類的非內聯靜態數據成員只是聲明,並且必須在命名空間范圍內定義: class.static.data#3

3:非內聯靜態數據成員在其類定義中的聲明不是定義,並且可能是除 cv void 之外的不完整類型。 未在類定義中內嵌定義的靜態數據成員的定義應出現在包含成員類定義的命名空間范圍內。 在命名空間范圍的定義中,靜態數據成員的名稱應使用 :: 運算符由其類名限定。 靜態數據成員定義中的初始化表達式在其類([basic.scope.class])的范圍內。

然后進一步細化這些規則,以便可以對整數或枚舉類型的非易失性非內聯 const 靜態數據成員進行大括號初始化(實際上是在聲明點定義變量): class.static.data#4

4:如果非易失性非內聯 const 靜態數據成員是整數或枚舉類型,則其在類定義中的聲明可以指定一個大括號或等號初始值設定項,其中作為賦值表達式的每個初始值設定項子句是一個常量表達式 ([expr.const])。 如果該成員在程序中被 odr 使用 ([basic.def.odr]) 並且命名空間范圍定義不應包含初始化程序,則該成員仍應在命名空間范圍內定義。 內聯靜態數據成員可以在類定義中定義,並且可以指定一個大括號或等號初始值設定項。

在非標准語言中,這表示您必須獨立於定義定義靜態成員變量,整數或枚舉的情況除外,這解釋了為什么您的示例失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM