2016-09-06 2 views
18

Ich habe Compiler, die auf sizeof nicht übereinstimmen. Für den folgenden Code werden Clang und GCC es kompilieren, aber andere Compiler, die ich verwenden muss, schlagen "illegal sizeof operand" fehl. Mein Lesen des Standards besagt, dass dies illegal ist, da sizeof nur einen Ausdruck annehmen kann (ich glaube nicht, dass S :: a ein Ausdruck ist) oder eine Typ-ID, aber es ist ungewöhnlich, dass sowohl GCC als auch Clang falsch liegen . Ich kann es natürlich durch sizeof(S().a) ersetzen, das mit all meinen Compilern funktioniert.Clang und GCC akzeptieren fragwürdige sizeof

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

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

Sind Clang und GCC falsch, oder habe ich den Standard falsch gelesen?

+7

eingeführt VS2015 akzeptiert es auch :) Können Sie bitte auch die "anderen Compi "und die entsprechenden gcc/clang-Versionen? – Rakete1111

+5

[Dies wurde in C++ 11 hinzugefügt] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html) – Praetorian

+0

Kann nicht reproduziert werden - g ++ 5.2.1, drang ++ 3.6.2.1 auf Ubuntu 15.10 –

Antwort

26

§ 5.1.1 [expr.prim.general] 13

Ein ID-Ausdruck, der eine nicht-statisches Datenelement oder nicht-statische Elementfunktion einer Klasse nur verwendet werden kann, bezeichnet:

- als Teil einer Klassenmitglied Zugang (5.2.5), in dem das Objekt Ausdruck des Mitglieds der Klasse [63] oder einer Klasse von dieser Klasse oder

abgeleitet bezeichnet - einen Zeiger auf Element zu bilden (5,3 .1) oder

- wenn der ID-Ausdruck bezeichnet ein nicht-statisches Datenelement, und es erscheint in einem unevaluierten Operanden [Beispiel:

struct S { 
    int m; 
}; 

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

-End Beispiel]

Edit: Wie @ Praetorian weist in Kommentaren auf die Frage selbst hin: Diese wurde in C++11

Verwandte Themen