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.