Back to TILs

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

References