C++ initialize_list_01
Date: 2020-07-11Last modified: 2023-02-17
Table of contents
struct A {
A() { cout << "A()"; }
explicit A( int ) { cout << "A( int )"; } // Não vai ser chamado pelo A{n}
explicit A( initializer_list<int> ) { cout << "A( initializer_list<int> )";
}
};
struct B {
B() { cout << "B()"; }
explicit B( int ) { cout << "B( int )"; }
};
struct C {
vector<int> mContainer;
explicit C( initializer_list<int> xs ) : mContainer( xs )
{
cout << "C( initializer_list<int> )" << endl;
for( const auto &x : mContainer ) {
cout << "xi = " << x << endl;
}
}
};
int main( [[maybe_unused]] int argc, [[maybe_unused]] char *argv[] )
{
// clang-format off
cout << "A a1; "; A a1; cout << endl; // A()
cout << "A a2{}; "; A a2{}; cout << endl; // A() não tem args então vai pelo ctor padrão
cout << "A a3{1}; "; A a3{1}; cout << endl; // A( initializer_list<int> )
cout << "A a4{1, 2}; "; A a4{1, 2}; cout << endl; // A( initializer_list<int> )
cout << "A a5(); "; A a5(); cout << endl; // não imprime nada; isso é a declaração de uma função
cout << "B b1; "; B b1; cout << endl; // B()
cout << "B b2{}; "; B b2{}; cout << endl; // B()
cout << "B b3{1}; "; B b3{1}; cout << endl; // B( int )
// B b4{1, 2}; error: no matching constructor for initialization of 'B'
C c1{ 10, 20, 30 };
// clang-format on
return 0;
}
Possible output
A a1; A()
A a2{}; A()
A a3{1}; A( initializer_list<int> )
A a4{1, 2}; A( initializer_list<int> )
A a5();
B b1; B()
B b2{}; B()
B b3{1}; B( int )
C( initializer_list<int> )
xi = 10
xi = 20
xi = 30