Considere o seguinte código:
#include <iostream>
struct A {
A(int, int) {
std::cout << "A::A(int, int)\n";
}
A(std::initializer_list<int>) {
std::cout << "A::A(std::initializer_list<int>)\n";
}
};
struct B {
A a(1, 2); // compiler error
};
struct C {
A a{1, 2}; // always call A::A(std::initializer_list<int>)
};
struct D {
A a{A(1, 2)}; // always call A::A(int, int), how UgLy it is!
};
int main() {
new B{};
new C{};
new D{};
}
Existe uma solução melhor do que A a{A(1, 2)};
?
O inicializador de membro padrão para o membro deve ser um inicializador de chave ou igual. (Parênteses não podem ser usados, pois podem entrar em conflito com a sintaxe de declaração de função em algumas situações.)
Assim, o membro pode ser inicializado de uma das duas maneiras:
Usando um inicializador igual:
Usando a lista de inicializadores de membros no construtor: