Pourquoi appelle-t-il 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 m’attendrais à ce que ce soit imprimer soit

  • X(int) , car X(answer); pourrait être interprété comme une dissortingbution de l’ int à X , ou
  • rien du tout, car X(answer); pourrait être interprété comme la déclaration d’une variable.

Cependant, il affiche X() , et je n’ai aucune idée de la raison pour laquelle X(answer); appellerait le constructeur par défaut.

POINTS DE BONUS: Que devrais-je changer pour obtenir une déclaration temporaire au lieu d’une déclaration de variable?

rien du tout, car 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 moteur par défaut (si non-POD et tout ça).

Sur votre édition: Pour obtenir un temporaire, vous avez quelques options:

  • (X(answer));
  • (X)answer;
  • static_cast(answer)
  • X{answer}; (C ++ 11)
  • []{ return X(answer); }(); (C ++ 11, peut entraîner une copie)
  • void(), X(answer);
  • X((void(),answer));
  • true ? X(answer) : X();
  • if(X(answer), false){}
  • for(;X(answer), false;);
  • X(+answer);

Les parenthèses sont facultatives. Ce que vous avez dit est identique à X answer; , et c’est une déclaration de déclaration.

Si vous souhaitez déclarer une variable de type X, vous devez le faire de la manière suivante:

 X y(answer);