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