mecanismo de invocación del constructor

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 } 

Rendimiento esperado :

 1 ) Default 2 ) Copy 

Salida real:


¿Qué hay de malo en mi comprensión del mecanismo de invocación del constructor?

Note que he omitido los archivos de cabecera por brevedad.

Caso 1)

m se interpreta como una función devuelve my y no toma argumentos. Para ver el resultado esperado, elimine () es decir, use my m;

Caso 2)

Esto es algo mejor conocido como el “análisis más irritante”.

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

Para ver el resultado esperado en este caso, pruebe my n((my())); [En lugar de tratar como una especificación de argumento como en el caso anterior, el comstackdor lo interpretaría ahora como una expresión debido al extra () ]

Mi interpretación:

my n((my())) es equivalente a my n = my() . Ahora, la expresión rvalue my() crea una temporal [es decir, una llamada al constructor predeterminado] y n se inicializa la copia a ese objeto temporal [no se llama al copy-ctor debido a alguna optimización del comstackdor ]

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

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

 my m(); 

como una statement de prototipo de función, no como una statement de variable y una llamada al constructor; de ahí que no vea salida.