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.