Ответ 1
std::vector
не нужен конструктор по умолчанию, потому что он никогда не использует его. Каждый раз, когда ему нужно построить элемент, он делает это с помощью конструктора копирования, потому что каждый раз, когда ему есть что-то копировать: либо существующий векторный элемент, либо элемент, который вы сами поставили для копирования через параметр метода (явно или неявно, полагаясь по аргументу по умолчанию)
Вы можете написать такой класс точно так же: каждый раз, когда вам нужно построить новый элемент в вашем массиве, попросите пользователя предоставить элемент для копирования. В этом случае создание этого исходного элемента становится ответственностью пользователя.
Каждый раз, когда он выглядит так, как будто std::vector
"требует" конструктора по умолчанию от вас, это просто означает, что где-то вы полагались на аргумент по умолчанию некоторых методов vector
, то есть именно вы пытались использовать по умолчанию, построить элемент, а не вектор. Сам вектор снова не будет пытаться создавать элементы по умолчанию.
Чтобы избежать требования конструктора по умолчанию при распределении памяти, стандартная библиотека выделяет необработанный неинициализированный блок памяти, а затем сразу же копирует новые элементы в этом необработанном блоке памяти (что-то new[]
не может сделать). Эта функциональность инкапсулируется в классе std::allocator
. Вы также можете использовать std::allocator
в своем коде, что означает, что "волшебство" также доступно вам.
Примечание: Вышеприведенное относится к предварительной версии С++ 11 для языка С++. С++ 11 многое изменило. И эти изменения создают ситуации, в которых std::vector
может использовать встроенные конструкторы по умолчанию.
Также стоит отметить, что даже исходная спецификация С++ 98 позволила реализациям использовать перегрузку функций вместо аргументов по умолчанию для реализации стандартного интерфейса библиотеки. Это означает, что формально можно иметь допустимую реализацию С++ 98 std::vector
, которая использует внутренние конструкторы внутри.