2016-09-06 7 views
18

Mam kompilatory, które nie zgadzają się na sizeof. Dla następującego kodu, Clang i GCC skompilują go, ale inne kompilatory, których muszę użyć, nie podają "nielegalnego rozmiaru argumentu". Moje odczytanie standardu mówi, że jest to nielegalne, ponieważ sizeof może przyjmować tylko wyrażenie (nie sądzę, że S :: a jest wyrażeniem) lub identyfikator typu, ale jest niezwykłe, aby GCC i Clang były błędne . Mogę oczywiście zastąpić go sizeof(S().a), który działa ze wszystkimi moimi kompilatorami.Clang i GCC akceptują wątpliwe sizeof

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

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

Czy Clang i GCC są błędne, czy też błędnie odczytuję standard?

+7

VS2015 również to akceptuje :) Czy możesz również podać "inne kompi lers "i odpowiadające im wersje gcc/clang? – Rakete1111

+5

[Zostało to dodane w C++ 11] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html) – Praetorian

+0

Nie można odtworzyć - g ++ 5.2.1, clang ++ 3.6.2.1 na Ubuntu 15.10 –

Odpowiedz

26

§ 5.1.1 [expr.prim.general] 13

identyfikacyjnego wyrażenie oznacza funkcję niż statyczna składowa danych lub użytkownika niż statyczne klasy mogą być wykorzystywane wyłącznie:

- w ramach dostępu członka klasy (5.2.5), w którym wyrażenie obiektu odnosi się do klasy członka [63] lub klasy pochodnej od tej klasy, lub

- do utworzenia wskaźnika do elementu (5.3 .1) lub

- jeśli identyfikator ekspresja oznacza nie-statycznego elementu danych i wydaje się, w unevaluated argumentu [na przykład:

struct S { 
    int m; 
}; 

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

końcem przykład]

Edycja: jako @Praetorian zaznacza w komentarzach do samego pytania: Zostało to wprowadzone w C++11

Powiązane problemy