2010-11-26 10 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

Resultados previstos:constructor mecanismo de invocación

1) Default 
2) Copy 

salida real:


¿Qué le pasa a mi comprensión del mecanismo de invocación del constructor?

Note He omitido los archivos de cabecera para abreviar.

Respuesta

11

Caso 1)

m se interpreta como un retorno de la función my y sin argumentos. para ver el resultado esperado eliminar () es decir utilizan my m;

Caso 2)

Esto es algo más conocido como el "análisis sintáctico más acuciantes".

n se interpreta como una función que devuelve my que toma un argumento de tipo puntero a la función que devuelve my sin tomar argumentos.

Para ver la salida esperada en este caso tratar my n((my())); [En lugar de tratar como una especificación de argumento como en el primer caso, el compilador ahora interpretarlo como una expresión debido a la extra de ()]

Mi interpretación:

my n((my())) es equivalente a my n = my(). Ahora la expresión rvalue my() crea un temporal [es decir, una llamada al constructor por defecto] y n se copia inicializado a ese objeto temporal [ninguna llamada a la copia-ctor debido a algún compiler optimization]

PS: No soy 100% seguro de la última parte de mi respuesta. Corrígeme si estoy equivocado.

+1

No se llama RVO, pero de hecho es una optimización común. – MSalters

+3

@MSalters: Sí, creo que esta es una variante de RVO. :) –

1

Al igual que Prasoon, sospecho que el compilador de C++ está analizando su código de una manera que no espera. Por ejemplo, creo que está analizando la línea

my m(); 

como una declaración de la función prototipo, no como una declaración de variables y llamar al constructor - de ahí que se ve ninguna salida.

Cuestiones relacionadas