[英]How to access the address of a static const member of a class?
該代碼不會編譯,並且錯誤信息是“ 未定義對`A :: a'的引用 ”:
代碼1:
#include <iostream>
using namespace std;
class A
{
public:
static const int a=0;
};
int main()
{
cout<<&A::a<<endl;
return 0;
}
但是對於非常量靜態成員,它會編譯:
代碼2:
#include <iostream>
using namespace std;
class A
{
public:
static int a;
};
int A::a=0;
int main()
{
cout<<&A::a<<endl;
return 0;
}
有沒有辦法訪問類的靜態const成員的地址? 如果有,怎么辦? 為什么代碼1無法編譯?
放
const int A::a;
在源文件中,否則編譯器不會為a生成地址。 注意,此處不重復該值。
該代碼無法編譯
該代碼不鏈接 ,但可以編譯。 如果要使用static const
成員的地址,則需要一個定義 ,因此只需添加類似於第二個代碼片段的定義即可:
const int A::a;
取的地址A::a
裝置A::a
是ODR -二手,和從部分中的C ++ 11標准(草案n3337)的9.4.2靜態數據成員 ,第3:
如果非易失性const靜態數據成員是整數或枚舉類型 ,則其在類定義中的聲明可以指定大括號或相等初始化器,其中作為賦值表達式的每個初始化器子句都是一個常數表達式(5.19) 。 可以使用constexpr說明符在類定義中聲明文字類型的靜態數據成員; 如果是這樣,則其聲明應指定一個花括號或相等的初始化程序,其中每個作為賦值表達式的初始化程序子句都是一個常量表達式。 [注意:在這兩種情況下,成員都可能出現在常量表達式中。 — [end note] 如果在程序中使用了成員 (3.2),則該成員仍應在名稱空間范圍中定義,並且該名稱空間范圍定義不應包含初始化程序。
由於要獲取地址,因此仍然需要定義靜態成員,就像對非const版本所做的那樣:
int A::a;
對於const
版本,您還需要
const int A::a;
請參閱此處進行良好的討論-標題引號“編譯時常量沒有地址”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.