В качестве продолжения этого вопроса для реализации construct
требуется распределитель по умолчанию (std::allocator<T>
) (согласно [default.allocator])
template <class U, class... Args> void construct(U* p, Args&&... args);
Эффекты:
::new((void *)p) U(std::forward<Args>(args)...)
То есть всегда инициализация значений. Результатом этого является то, что std::vector<POD> v(num)
, для любого типа pod, будет инициализировать значение num
элементов, что дороже, чем инициализация по умолчанию элементов num
.
Почему & dagger;std::allocator
не предоставил дополнительную перегрузку по умолчанию? То есть, что-то вроде (заимствовано из Кейси):
template <class U>
void construct(U* p) noexcept(std::is_nothrow_default_constructible<U>::value)
{
::new(static_cast<void*>(p)) U;
}
Была ли причина предпочесть инициализацию значения в случаях вызова? Мне кажется удивительным, что это нарушает обычные правила С++, где мы платим только за то, что хотим использовать.
& dagger; Я предполагаю, что такое изменение невозможно в будущем, учитывая, что в настоящее время std::vector<int> v(100)
предоставит вам 100 0
s, но мне интересно, почему это так... учитывая, что так же легко потребовалось бы std::vector<int> v2(100, 0)
таким же образом, что существуют различия между new int[100]
и new int[100]{}
.