我有一個類B派生自類A.聲明一個靜態字段f,並且B可能聲明一個相同名稱的相似字段。以下不工作:在編譯時比較靜態字段指針
struct A { static int f; };
struct B : A { static int f; }; // A::f is different from B::f
struct C : A {}; // A::f is the same as C::f
BOOST_STATIC_ASSERT((&A::f != &B::f));
BOOST_STATIC_ASSERT((&A::f == &C::f));
雖然理論上這些斷言可以在編譯時檢查,他們是不允許的,因爲常量表達式不能把地址。
有沒有辦法在編譯時進行這種檢查工作?
具有靜態存儲持續時間的對象的地址是一個常量表達式。 – GManNickG 2013-03-21 00:30:59
@GManNickG:如果靜態變量的定義不在TU中的靜態斷言之前,GCC會抱怨它不是一個常量表達式。如果是,它就會起作用。不知道這是否符合標準。 – 2013-03-21 00:34:58
@ user1131467:Hm,我可以從標準中得到的是§5.19/ 4:「地址常量表達式是std :: nullptr_t類型或指針類型的prvalue核心常量表達式(在上下文需要轉換後)該函數計算的是具有靜態存儲持續時間的對象的地址,函數地址或空指針值。文字常量表達式,引用常量表達式和地址常量表達式統稱爲常量表達式。呃,爲什麼TU很重要? – GManNickG 2013-03-21 00:41:44