vector constructor
Aggregate initialization brought us many good things. There is though one nasty pitfall with std::vector
. std::vector
can be initialized with a size_t to specify its initial size. There is a potential ambiguity since the vector also accepts size_t as its element type:
#include <cassert>
#include <vector>
int main()
{
std::vector<size_t> vec0(5); // vector size is set
std::vector<size_t> vec1{5}; // vector size isn't set directly but vector is initialized with 1 element
assert(vec0.size() == 5);
assert(vec1.size() == 1);
std::vector<size_t> vec2{vec0.size()}; // even worse: vectors do not have the same size now
return 0;
}
This is especially a problem with 32 bits code where size_t is an int typedef. A solution is that the C++ committee resolves the ambiguity e.g. by introducing a 2 argument overload for vector constructor (with an extra enum). Until then it's watching out