212 votes

Constructeur par défaut avec des crochets vides

Y a-t-il une bonne raison pour qu'un ensemble vide de parenthèses (parenthèses) ne soit pas valide pour appeler le constructeur par défaut en C ++?

 MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error
 

Je semble taper "()" automatiquement à chaque fois. Y a-t-il une bonne raison pour laquelle ce n'est pas autorisé?

178voto

Constantin Points 12185

Plus délicate à analyser

Ceci est connu comme le "C++'s plus délicate à analyser". En gros, tout ce qui peut être interprété par le compilateur en fonction de la déclaration sera interprété comme une déclaration de fonction, même si elle résulte de l'AST n'est pas compilé.

Un autre exemple du même problème:

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v est interprété comme une déclaration de fonction avec 2 paramètres et ne parvient pas à compiler.

La solution est d'ajouter une autre paire de parenthèses:

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

Ou, si vous avez le C++11 et de la liste d'initialisation (aussi connu comme l'initialisation uniforme) disponibles:

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

Avec cela, il n'y a aucune façon elle pourrait être interprétée comme une déclaration de fonction.

115voto

1800 INFORMATION Points 55907

Parce que c'est le traité comme la déclaration d'une fonction:

 int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
 

50voto

Nemanja Trifunovic Points 17239

La même syntaxe est utilisée pour la déclaration de fonction - par exemple, la fonction object , ne prenant aucun paramètre et renvoyant MyObject

11voto

Fred Larson Points 27404

Parce que le compilateur pense qu'il s'agit d'une déclaration de fonction qui ne prend aucun argument et retourne une occurrence MyObject.

7voto

Black Points 3104

Je suppose que le compilateur ne saurait pas si cette déclaration:

Objet MyObject ();

est un appel constructeur ou un prototype de fonction déclarant une fonction nommée objet avec le type de retour MyObject et aucun paramètre.

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