簡體   English   中英

在C ++ 11及更高版本中,定義“結構體中的靜態const變量”是否顯式地有所不同?

[英]Does defining 'static const variable in a struct' explicitly makes any difference in C++ 11 and above?

我了解在較舊的C ++版本中,將值分配給結構中的const static variable ,而不在結構外部定義它不會為該變量創建內存分配,而是在編譯過程中將const static variable替換為其分配的值並訪問此類變量的地址會產生錯誤(因為未定義/已分配內存)

struct A{
    int i;
    static const int j = 20;
}

因此,在這里定義變量,這應該通過地址來完成

const int A::j; //line1

但是,在更高版本的C ++中,即使未在line1定義該變量,也將分配內存,並且可以獲取其地址。

我不確定在C ++ 11的版本中添加line1是否會在任何其他方面有所不同(因為在沒有此行的情況下也會分配內存)。 如果有所作為,那會是什么? (是否只是為了提供向后兼容性?)

請幫忙!!!

編輯:我不確定是否在C ++ 11之前就接受了這種方法,但是由於我是從C ++ 11觀察到的,所以我提到了它(使用MSVC ++ 14.0)

更新:還觀察到,當嘗試打印不帶line1的j的地址時,在MSVC++ 14.0 ,它可以打印地址,但是使用gcc compiler (cpp.sh) ,它不能打印,並且給出鏈接錯誤(undefined reference)

在C ++ 17中,將引入內聯變量。 類的static constexpr數據成員將隱式內聯,並將成為該數據成員的定義。 鏈接時,多個定義將解析為該數據成員的單個地址。

在您的示例中, A::jconst而不是constexpr ,因此該規定將不適用於它。 您的示例在從C ++ 98到C ++ 17的所有版本中都將相同。

jconstexpr的情況下,在C ++ 17和更高版本中,離線定義const int A::j將成為編譯器將忽略的冗余聲明。 是的,這是出於向后兼容的原因。

暫無
暫無

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

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