The reason is that initialization vector<base> vec = {b, b1};creates std::initializer_list<base>and passes it to the corresponding vector constructor. Then the copy will continue.
You can limit the number of copies by directly initializing members std::initializer_list<base>, instead of creating named objects. Something like that:
vector<base> vec = {{}, {2}};
reserve , emplace .
vector<base> vec;
vec.reserve(2);
vec.emplace_back();
vec.emplace_back(2);