¿Cómo llamar a un constructor con un inicializador de lista vacío en c++17?
Considere este código:
class Foo
{
public:
Foo(){cout<<"vacio"<<endl;}></endl;}><int>){cout<<"lista_init"<<endl;}
};
int main()
{
foo(); // vacio
foo{}; // vacio
foo({}); // lista_init para c++14, vacio para c++17
}
me pregunto por qué se comportan de manera diferente entre c++14 y c++17, y cómo construir un foo
con una initializer_list
vacía en c++17. };=”” int=”” main()=”” {=”” foo();=”” vacio=”” foo{};=”” vacio=”” foo({});=”” lista_init=”” para=”” c++14,=”” vacio=”” para=”” c++17=”” }=”” “`=”” me=”” pregunto=”” por=”” qué=”” se=”” comportan=”” de=”” manera=”” diferente=”” entre=”” c++14=”” y=”” c++17,=”” y=”” cómo=”” construir=”” un=”” foo
=”” con=”” una=”” initializer_list
=”” vacía=”” en=””></endl;}
};
int main()
{
foo(); // vacio
foo{}; // vacio
foo({}); // lista_init para c++14, vacio para c++17
}
“`
me pregunto por qué se comportan de manera diferente entre c++14 y c++17, y cómo construir un foo
con una initializer_list
vacía en c++17.>
davy.ai
En C++14, el constructor
Foo(initializer_list<int>)
se llama con uninitializer_list
vacío cuando se utilizaFoo({})
. Sin embargo, en C++17, esta sintaxis es ambigua y también podría significar una llamada de constructor predeterminado con unstd::initializer_list
vacío. Por lo tanto, en C++17, se pasa uninitializer_list
vacío al constructor predeterminadoFoo()
.Para construir un
Foo
con uninitializer_list
vacío en C++17, puedes usar el siguiente código:Esto llama explícitamente al constructor con un argumento
std::initializer_list<int>
vacío.