.. include:: <mmlalias.txt> Brace Initialization: A Mess ============================ .. contents:: :local: Explicit Constructor And Brace Initialization --------------------------------------------- * Any explicit constructor can be invoked the "new" brace initialization syntax * ... unless there is a ``std::initializer_list`` constructor .. literalinclude:: code/explicit-ctor.cpp :caption: :download:`code/explicit-ctor.cpp` :language: c++ Ambiguity: Explicit And ``std::initializer_list`` Constructor ------------------------------------------------------------- * What if there are two constructors which would satisfy calling sequence? * |longrightarrow| be explicit .. literalinclude:: code/ambiguity.cpp :caption: :download:`code/ambiguity.cpp` :language: c++ Rule ---- * Use brace initialization, preferably * Unless something does not work or compile |:pig:| Realistic Example: ``std::vector``: Two ``int`` (Explicit) ---------------------------------------------------------- .. sidebar:: * `std::vector constructors <https://en.cppreference.com/w/cpp/container/vector/vector>`__ * ``std::vector<int>`` has one explicit constructors which takes two ``int`` parameters * One is the number of elements to create, one is their value * Using the explicit constructor, explicitly, by writing gool old function-call-style initialization .. literalinclude:: code/c++11-brace-initialization-vector-explicit.cpp :caption: :download:`code/c++11-brace-initialization-vector-explicit.cpp` :language: c++ .. code-block:: console $ ./code/c++11-brace-initialization-vector-explicit 42 42 42 Realistic Example: ``std::vector``: Two ``int`` (``std::initializer_list``) --------------------------------------------------------------------------- .. sidebar:: * `std::vector constructors <https://en.cppreference.com/w/cpp/container/vector/vector>`__ * ``std::vector<int>`` has one another constructor which takes a ``std::initializer_list<int>`` * ... of arbitrary size - even 2 is ok * |longrightarrow| must use brace initialization to disabiguate .. literalinclude:: code/c++11-brace-initialization-vector-initializer-list.cpp :caption: :download:`code/c++11-brace-initialization-vector-initializer-list.cpp` :language: c++ .. code-block:: console $ ./code/c++11-brace-initialization-vector-initializer-list 3 42 Nicolai Josuttis, Complaining About C++ --------------------------------------- * `CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++” <https://youtu.be/7DTlWPgX6zs>`__ .. raw:: html <iframe width="560" height="315" src="https://www.youtube.com/embed/7DTlWPgX6zs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe> * `When C++ Style Guides Contradict - Nicolai Josuttis - CppCon 2019 <https://youtu.be/WRQ1xqYBKgc>`__ .. raw:: html <iframe width="560" height="315" src="https://www.youtube.com/embed/WRQ1xqYBKgc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>