std::vector
не нужен конструктор по умолчанию, поскольку он никогда не использует его. Каждый раз, когда ему нужно построить элемент, он делает это, используя конструктор copy, потому что каждый раз, когда ему есть что-то копировать: либо существующий векторный элемент, либо элемент, который вы сами поставили для копирования через параметр метода (явно или неявно, опираясь на аргумент по умолчанию )
Вы можете написать класс таким же образом: каждый раз, когда вам нужно построить новый элемент в вашем массиве, требуется, чтобы пользователь предоставил элемент для копирования. В этом случае создание этого оригинального элемента становится ответственностью пользователя.
Каждый раз, когда она появляется, как будто std::vector
«требует» конструктор по умолчанию от вас, это просто означает, что где-то вы полагались на аргумент по умолчанию некоторых из vector
сек методов, т.е. был вы которые пытались default- построить элемент, а не вектор. Сам вектор, опять же, никогда не будет пытаться использовать элементы по умолчанию.
Для того, чтобы избежать требования конструктора по умолчанию во время выделения памяти, стандартная библиотека выделяет сырец неинициализированного блока памяти, а затем сразу же скопировать конструирует новые элементы в этом блоке сырой памяти (что-то new[]
не может сделать). Эта функциональность включена в класс std::allocator
. Вы также можете использовать std::allocator
в своем коде, что означает, что «волшебство» сразу же доступно для вас.
Примечание: Вышеприведенное относится к предварительной версии языка C++ 11 на языке C++. C++ 11 многое изменило. И эти изменения создают ситуации, в которых std::vector
могут использовать встроенные конструкторы по умолчанию.
Кроме того, возможно, стоит отметить, что даже оригинальную C++ 98 спецификация позволили реализациям использовать функции перегрузки вместо аргументов по умолчанию для реализации стандартного интерфейса библиотеки. Это означает, что формально можно иметь действительную реализацию C++ 98 из std::vector
, которая использует стандартные конструкторы внутренне.
Как разместить пространство в первую очередь? таНос? – anon
@anon: Посмотрите, как это делает 'vector' ... он использует распределитель, например' new_allocator'. В моей (старой) установке Cygwin он работает следующим образом: '{return static_cast <_Tp*> (:: operator new (__ n * sizeof (_Tp))); } 'Или' malloc_allocator' делает это так: 'pointer __ret = static_cast <_Tp*> (malloc (__ n * sizeof (_Tp)));' – Dan