2016-09-06 68 views
18

我有編譯器不同意sizeof。對於下面的代碼,Clang和GCC將編譯它,但是我必須使用的其他編譯器失敗,聲稱「非法sizeof操作數」。我對標準的閱讀說這是非法的,因爲sizeof只能表達一個表達式(我不認爲S :: a是表達式)或類型id,但是對於GCC和Clang都是錯誤的。我明顯可以用sizeof(S().a)代替它,它可以與我的所有編譯器一起工作。Clang和GCC接受可疑​​的sizeof

struct S 
{ 
    int a[32]; 
    int b; 
    int c; 
    int d[32]; 
}; 

int main() 
{ 
    return sizeof(S::a); 
} 

Clang和GCC是錯的,還是我誤讀了標準?

+7

介紹的VS2015也接受它:)你也可以請指定「其他compi lers「和相應的gcc/clang版本? – Rakete1111

+5

[This is added in C++ 11](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html) – Praetorian

+0

無法重現-g ++ 5.2.1,在Ubuntu 15.10上使用clang ++ 3.6.2.1 –

回答

26

§5.1.1 [expr.prim.general] 13

一個ID表達式表示只能用於一類的非靜態數據成員或非靜態成員函數:

- 作爲類成員訪問(5.2.5)的一部分,其中對象表達式指向成員的類[63]或從該類派生的類,或

- 形成指向成員的指針(5.3 .1)或

- 如果該id-表達式表示的非靜態數據成員,並將其顯示在一個未計算的操作數 [實施例:

struct S { 
    int m; 
}; 

int i = sizeof(S::m);  // OK 
int j = sizeof(S::m + 42); // OK 

末端示例]

編輯: 作爲@Praetorian在對這個問題本身的評論中指出:這是在C++11

相關問題