Должен ли construct () по умолчанию инициализировать вместо инициализации значения?
В качестве продолженияэтот вопрос, распределитель по умолчанию (std::allocator<T>
) требуется для реализацииconstruct
следующим образом (согласно [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)
для любого типа модуля будет инициализировать значениеnum
элементы - что дороже, чем инициализация по умолчаниюnum
элементы.
Почему не† std::allocator
обеспечить инициализацию по умолчанию дополнительной перегрузки? То есть что-то вроде (позаимствовано уCasey):
template <class U>
void construct(U* p) noexcept(std::is_nothrow_default_constructible<U>::value)
{
::new(static_cast<void*>(p)) U;
}
Была ли причина предпочитать инициализацию значения в случаях вызова? Мне кажется удивительным, что это нарушает обычные правила C ++, когда мы платим только за то, что хотим использовать.
†Я предполагаю, что такое изменение невозможно в будущем, учитывая, что в настоящее времяstd::vector<int> v(100)
даст вам 1000
с, но мне интересно, почему это так ... учитывая, что можно было бы так же легко потребоватьstd::vector<int> v2(100, 0)
так же, как есть различия междуnew int[100]
а такжеnew int[100]{}
.