80 votes

Pourquoi est-ce que cela n’appelle le constructeur par défaut ?

struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

Je me serais attendu à ce à imprimer

  • X(int)car X(answer); pourrait être interprété comme une fonte à partir de int de X, ou
  • rien du tout, parce qu' X(answer); pourrait être interprété comme la déclaration d'une variable.

Cependant, il imprime X(), et je n'ai aucune idée pourquoi, X(answer); pourrait appeler le constructeur par défaut.

POINTS BONUS: Qu'aurais-je à changer pour obtenir un temporaire au lieu d'une déclaration de variable?

73voto

Xeo Points 69818

rien du tout, parce que X(réponse); pourrait être interprété comme la déclaration d'une variable.

Votre réponse est cachée ici. Si vous déclarez une variable, vous invoquez son défaut ctor (si non-POD et ce genre de trucs).

Sur votre edit: Pour obtenir un temporaire, vous avez plusieurs options:

65voto

Kerrek SB Points 194696

Les parenthèses sont facultatives. Ce que vous dites sont identique à `` , et c’est une instruction de déclaration.

9voto

Wouter Huysentruit Points 8965

Si vous souhaitez déclarer une variable de type X, vous devriez faire de cette façon :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X