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 ...