.. ot-topic:: cxx11.new_language_features.brace_initialization.mess :dependencies: cxx11.new_language_features.brace_initialization.intro, cxx11.new_language_features.brace_initialization.implementor_view .. include:: 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 `__ * ``std::vector`` 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 `__ * ``std::vector`` has one another constructor which takes a ``std::initializer_list`` * ... 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++” `__ .. raw:: html * `When C++ Style Guides Contradict - Nicolai Josuttis - CppCon 2019 `__ .. raw:: html