Appendix D. Resolving Conflicts in the Initialization of a vector

This appendix is a supplement to “A potential pitfall with the meaning of () and {} with a vector”. That content requires some background on a feature added to the Standard Library with C++11, std::initializer_list. You can find more details on this topic in Section 3.1.3 of The C++ Standard Library: A Tutorial and Reference, 2nd edition, by Nicolai M. Josuttis (O’Reilly, 2012).

In the vector class, we will find multiple constructors, including the following two:

template <typename T /* ... this is a simplification */>
   class vector
   {
      // ...
   public:
      vector(size_type, const T&);        // number of elements, initial value
      vector(std::initializer_list<T>);   // braces with values of type T
      // ...
   };

For this reason, given a vector<int> type and two values of integral types, both constructors are viable:

// 10 ints of value -1 or two ints valued 10 and -1?
vector<int> v1{10, -1};      // two ints valued 10 and -1
vector<int> v2(10, -1);      // 10 ints of value -1

In C++, when using braces in a constructor, if there’s a choice to be made between a constructor with an std::initializer_list (#include<initializer_list>) and another constructor, and both are viable, then the one that accepts a initializer_list takes preference. In contrast, when using parentheses, the one accepting an initializer_list is not considered (by definition). This leads to a surprising dichotomy, but it is part of the rules of the language (it would definitely be ...

Get Learning Modern C++ for Finance now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.