Должен ли 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]{}.

Ответы на вопрос(1)

Ваш ответ на вопрос