2011-04-01 39 views
12
struct HybridExpression { 
    RawExpressionElement *ree; 
    ExpressionNode *en; 
};  

vector<HybridExpression> hexpression; 

hexpression.insert(hexpression.begin() + starti, 
     (HybridExpression) {NULL, en}); 

gcc compila sin previo aviso pero visual studio 2010 ni siquiera lo compilará.es este C++ no válido?

Es imposible como este bit: (HybridExpression) {NULL, en}

+2

¿Cuál es el mensaje de error del compilador? –

Respuesta

19

Esto está utilizando una parte del lenguaje de programación C que no está incluida en C++, se llama "literal compuesto". g++ -ansi diagnosticará esto, diciendo

advertencia: ISO C++ prohíbe compuestos literales-

Ésta es no una parte de C++ 0x.

La ++ 0x sintaxis compatibles C habría sido

hexpression.insert(hexpression.begin() + starti, HybridExpression{NULL, en}); 

Para citar el estándar C99, párrafo 6.5.2.5:

Una expresión de sufijo que consiste en un nombre tipo entre paréntesis seguido mediante una lista de inicializadores incluidos en llaves es un compuesto literal. Proporciona un objeto sin nombre cuyo valor viene dado por la lista de inicializadores.

+0

Bueno, no puedo enojarme en Microsoft si no está en los estándares ... –

+0

@ tm1rbrt: ¡todavía puedes enfurecerlos por abandonar C! – Cubbi

+2

@Cubbi: Eso es algo bueno, no es algo malo. – Puppy

0

Esto no es válida C++ en el estándar actual. I think GCC lo permite debido a una extensión de compilador específica de GCC.

3

De acuerdo con http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C_002b_002b-Extensions.html#C_002b_002b-Extensions, puede usar extensiones C (incluidas las cosas C99) en programas C++ compilados con GCC.

Compound literals es la extensión que está usando en realidad.

+0

literales compuestos no están incluidos en C++ 0x, al menos a partir de N3242, y los inicializadores no constantes no son la extensión utilizada en este caso (son la extensión de gcc para el lenguaje C89, no para C++). – Cubbi

+0

@Cubbi: como dice el primer enlace, puede usar extensiones gcc para el lenguaje C para C++. –

+0

sí, el primer enlace es bueno, es por eso que no perdonó. El segundo no es relevante. Debería haber sido http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Compound-Literals.html#Compound-Literals – Cubbi

Cuestiones relacionadas