J'essaie actuellement de me faire une idée de l'initialisation uniforme de C++11. Je suis tombé sur ce cas ambigu : considérons une classe qui peut être construite soit à partir d'un constructeur à deux arguments, soit à partir d'une liste d'initialisation de longueur quelconque :
class Foo {
public:
Foo(int a, int b) {
std::cout << "constructor 1" << std::endl;
}
Foo(std::initializer_list<int>) {
std::cout << "constructor 2" << std::endl;
}
};
En suivant la convention d'initialisation uniforme, je m'attends à ce que ce qui suit fonctionne :
Foo a (1, 2)
imprime constructor 1
(duh)
Foo b {1, 2}
imprime constructor 1
Foo c = {1, 2}
imprime constructor 2
Cependant, il semble que le compilateur interprète Foo b {1, 2}
comme une initialisation de liste, et appelle le constructeur 2. Est-ce que le ()
syntaxe le seul moyen de forcer le compilateur à prendre en compte d'autres types de constructeurs lorsqu'un constructeur de type liste d'initialisation est présent ?
3 votes
En rapport : stackoverflow.com/questions/9976927/ -- std::vector est un "exemple classique", bien que je n'en trouve que peu de mention sur SO.