[英]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::j
是const
而不是constexpr
,因此該規定將不適用於它。 您的示例在從C ++ 98到C ++ 17的所有版本中都將相同。
在j
為constexpr
的情況下,在C ++ 17和更高版本中,離線定義const int A::j
將成為編譯器將忽略的冗余聲明。 是的,這是出於向后兼容的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.