Почему в C++ 11 нет вектора (size_type n, const Allocator& alloc)?
В C++11 std::vector имеет конструктор vector(size_type n)
который будет строить по умолчанию n
элементы на месте, которые можно использовать с классами по умолчанию, которые можно создавать, перемещать и не копировать.
Однако, в отличие от любого другого векторного конструктора, нет варианта, который бы использовал распределитель, и я прибег к следующему:
// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
foos.emplace_back();
Есть ли лучший способ сделать это? Есть ли конкретная причина vector(size_type n, const Allocator& alloc)
был исключен из стандарта?
2 ответа
Подумав об этом, в конце концов, это не будет дефектом.
Возможно, что allocator_type
а также value_type
извращенно того же типа. В этом случае, какая функция будет vector(3, alloc)
вызов? Конструктор, который принимает значение по умолчанию для копирования-инициализации во все элементы, или тот, который принимает размер и распределитель? Это неоднозначно, и, следовательно, ошибка компиляции.
Во-первых, вместо вашего reserve
/ цикл вещь, вы можете просто использовать resize
чтобы достичь того, что сделает ваш воображаемый конструктор:
const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);
Другой вариант заключается в использовании версии с тремя аргументами size_type n
конструктор:
const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);
Хотя это на самом деле копирует конструкции в элементы, которые могут быть или не быть приемлемыми.
На обоснование? Без понятия. Вероятно, упускается из виду.