2015-11-24 48 views
12

E 'mia convinzione che questo codice:Errore mio o bug nel compilatore intel? sizeof un errore di membro non statico

#include <stdio.h> 

struct foo { 
    char array[1024]; 
}; 

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

è valido C++. g ++ lo compila bene con -ansi -pedantic. Tuttavia, la compilazione con ICC di Intel 12.1.3 ottengo:

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

E 'un mio errore o è ICC facendo la cosa sbagliata re: le specifiche C++?

+3

Questo è [N2253] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers /2007/n2253.html), parte di C++ 11. –

+0

clang ++ pensa che sia anche un errore: ': 8: 62: errore: uso non valido di membro di dati non statici 'array' fprintf (stderr," sizeof (foo :: array):% zd \ n ", sizeof (foo :: array)); ~~~~~^~~~~ ' –

+0

GCC è ora impostato su C++ 11, forse questo è il problema? Probabilmente dovrai dire ad altri compilatori di usare C++ 11, possibilmente con '-std = C++ 11'. –

risposta

1

Si tratta di un errore del compilatore o forse il compilatore è stato rilasciato prima che questa funzione fosse adottata nello standard.

Secondo l'++ standard C (5,1 espressioni primario)

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

Sembra che gcc abbia effettuato il porting della funzione in C++ 98 e non sia stato aggiunto in icc fino al 14.0 –

+0

@gct Sembra correttamente. Il C + = Standard consente di utilizzare una tale costruzione. Tutto il resto è il tuo problema personale. –

+0

@gct Leggere anche i commenti in cui viene fornito un riferimento a N2253 –