ser que puede privado inicializar dinamico definicion define constructores como clases c++ constructor copy-constructor most-vexing-parse

puede - que es un constructor en c++



mecanismo de invocación del constructor (2)

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 encabezado por brevedad.


Al igual que Prasoon, sospecho que el compilador 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 declaración de prototipo de función, no como una declaración de variable y una llamada al constructor; de ahí que no vea salida.


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 compilador 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 compilador ]

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