2015-11-24 7 views
12

Es ist meine Überzeugung, dass dieser Code:Mein Fehler oder Fehler im Intel Compiler? sizeof ein nicht-statisches Element Fehler

#include <stdio.h> 

struct foo { 
    char array[1024]; 
}; 

int main() { 
    fprintf(stderr, "sizeof(foo::array): %zd\n", sizeof(foo::array));  
} 

Ist gültig C++. g ++ kompiliert es einfach mit -ansi -pedantic. Doch mit Intels icc 12.1.3 Kompilieren erhalte ich:

error #288: a nonstatic member reference must be relative to a specific object 

Ist es mein Fehler oder icc tut das Falsche re: die C++ spec?

+3

Das ist [N2253] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers /2007/n2253.html), Teil von C++ 11. –

+0

Clang ++ denkt, es ist auch ein Fehler: ': 8: 62: Fehler: ungültige Verwendung von nicht-statischen Datenelement 'Array' fprintf (stderr," sizeof (foo :: array):% zd \ n ", sizeof (foo :: array)); ~~~~~^~~~~ ' –

+0

GCC standardmäßig auf C++ 11 jetzt, vielleicht ist das das Problem? Wahrscheinlich müssen Sie anderen Compilern mitteilen, C++ 11 zu verwenden, möglicherweise mit "-std = C++ 11". –

Antwort

1

Es ist ein Compiler-Fehler oder der Compiler wurde ausgegeben, bevor diese Funktion in den Standard übernommen wurde.

Nach dem C++ Standard (5.1 Primäre Ausdrücke)

13 An id-expression that denotes a non-static data member or non-static member function of a class can only be used:

— if that id-expression denotes a non-static data member and it appears in an unevaluated operand.

[ Example: 
struct S { 
int m; 
}; 
int i = sizeof(S::m); // OK 
int j = sizeof(S::m + 42); // OK 
—end example ] 
+0

Es klingt wie gcc zurück-portierte das Feature in C++ 98, und es wurde nicht in Icc bis 14,0 –

+0

@ gct Es klingt korrekt. Der C + = Standard erlaubt es, eine solche Konstruktion zu verwenden. Alles andere ist dein persönliches Problem. –

+0

@gct Lesen Sie auch Kommentare, wo ein Verweis auf N2253 gegeben ist –