2009-02-27 16 views
11

¿Alguien puede decirme qué efecto tiene este elenco (además de establecer happyNumber en 1337), si hay alguno, y si no tiene otro efecto, cómo puedo escribir código como este? ¿Es esto un error del compilador, o alguna "característica escondida" de C++?¿Qué pasa con static_cast con múltiples argumentos?

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337); 

Me sorprendió que compilara en absoluto. Lo encontré a través de un error donde accidentalmente configuré el segundo parámetro a algo que se suponía que debía ir en una llamada a función de la expresión que se estaba emitiendo. Esto resultó en un desagradable error donde el objeto fue lanzado desde el segundo parámetro, llamando a la función con un solo argumento. Se compiló ... Y no auge inicialmente ...

Estoy utilizando Microsoft Visual C++ 2008.

+0

Eso es perfectamente legítimo, y no hay ningún error. – Anonymous

+0

Ah, sí, tienes razón. Fue tan confuso para mí que * supe * tenía que ser un error del compilador, que no lo fue :) Nunca antes me encontré con el operador de coma. – Statement

Respuesta

30

molde estático toma un argumento, pero su argumento es una expresión, y puede incluir expresiones del comma operator. Coma se utiliza en situaciones en las que desee evaluar dos o más expresiones a la vez por sus efectos secundarios, por ejemplo:

int i, j; 
for (i=0, j=0; i < 10; i++,j++) { 
    // do stuff 
} 

Es algo útil porque sin ella sólo se podía evaluar una expresión de cada uno para el inicializador, condición y continuar partes del ciclo for (o cualquier otro lugar donde se espera una expresión). Sin embargo, no suele ser el código más claro, y la semántica es impar. Como observó, una secuencia separada por comas evalúa el valor de su última expresión.

+0

Entiendo el uso de la sintaxis, pero no logro entender la funcionalidad en un static_cast. – Statement

+0

No hay funcionalidad. Solo hace algunas operaciones usando el operador de coma y emite el resultado. – Anonymous

+0

Ah, gracias a usted y Ruben ahora entiendo cómo funciona, y aprendió algo nuevo :) – Statement