2012-09-20 88 views
17

這是合法的C++嗎?你可以在聲明另一個成員時使用sizeof一個成員嗎?

struct foo 
{ 
    int a[100]; 
    int b[sizeof(a)/sizeof(a[0])]; 
}; 

GCC 4.6接受它,但MSVC 2012沒有。這似乎對我來說應該沒問題,但有一點谷歌搜索沒有幫助,我不知道該在標準中看哪裏。

MSVC 2012提供了以下的輸出:

error C2327: 'foo::a' : is not a type name, static, or enumerator 
error C2065: 'a' : undeclared identifier 
error C2070: ''unknown-type'': illegal sizeof operand 
warning C4200: nonstandard extension used : zero-sized array in struct/union 
+0

可能重複:// stackoverflow.com/questions/9656941/why-i-cant-initialize-non-const-static-member-or-static-array-in-class) –

+2

即使最終原因是相似的,這個問題看起來與我很不一樣。 – Gorpik

+2

C++ 11標準中的相關段落是我認爲的第5章第8段。 – jrok

回答

18

這在C++ 03,因爲這些成員都是非靜態數據成員是非法的。

從C++ 11開始,這是合法的,因爲在未評估的操作數中,可以使用非靜態數據成員而不具有相應的對象。

1

試試這個:這是2010年MSVC和MSVC一種變通方法2012

struct Aoo 
{ 
    typedef int ArrayType; 
    ArrayType a[100]; 
}; 

struct foo : public Aoo 
{ 
    enum {bSize = sizeof(Aoo)/sizeof(Aoo::ArrayType)}; 
    int b[bSize]; 
}; 
[爲什麼不能初始化非const靜態成員或類的靜態數組?(HTTP的
相關問題