c++ syntax most-vexing-parse

c++ - ¿Por qué esto llama al constructor predeterminado?



syntax most-vexing-parse (3)

struct X { X() { std::cout << "X()/n"; } X(int) { std::cout << "X(int)/n"; } }; const int answer = 42; int main() { X(answer); }

Hubiera esperado que esto se imprimiera

  • X(int) , porque X(answer); podría interpretarse como un lanzamiento de int a X , o
  • nada en absoluto, porque X(answer); podría interpretarse como la declaración de una variable.

Sin embargo, imprime X() , y no tengo idea de por qué X(answer); llamaría al constructor predeterminado.

PUNTOS DE BONIFICACIÓN: ¿Qué tendría que cambiar para obtener una declaración temporal en lugar de una variable?


nada en absoluto, porque X (respuesta); podría interpretarse como la declaración de una variable.

Tu respuesta está escondida aquí. Si declaras una variable, invocas su ctor predeterminado (si no es POD y todo eso).

En su edición: para obtener un temporal, tiene algunas opciones:


Los paréntesis son opcionales. Lo que dijiste es idéntico a X answer; , y es una declaración declaración.


Si quiere declarar una variable del tipo X, debe hacerlo de esta manera:

X y(answer);