Представьте, что я хочу построить std::vector
объектов фиксированного размера без конструкторов перемещения или копирования, таких как std::atomic<int>
. В этом случае базовый класс std::atomic
имеет конструктор с 1 аргументом, который принимает int
, а также конструктор по умолчанию (который инициализирует значение 0).
Использование синтаксиса initializer_list
, такого как std::vector<std::atomic<int>> v{1,2,3}
, не работает, потому что аргументы сначала преобразуются в тип элемента T
вектора как часть создания initializer_list
, и поэтому будет вызван конструктор копирования или перемещения.
В частном случае std::atomic<int>
я могу сконструировать вектор по умолчанию, а затем изменить элементы после:
std::vector<std::atomic<int>> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
Однако, помимо того, что это уродливо и неэффективно, это не общее решение, поскольку многие объекты могут не предлагать постконструкционные мутации, эквивалентные тому, что вы могли бы получить, вызвав соответствующий конструктор.
Есть ли способ добиться желаемого поведения при построении вектора?
std::deque
. Но если вы не можете, единственный способ сделать то, что вы хотите, - использовать специальный распределитель. - person Brian Bi   schedule 13.10.2017std::deque
разрешает эту строительную идиому? - person BeeOnRope   schedule 13.10.2017std::deque
вам придется размещать элементы один за другим, но это будет работать, потому что добавление элементов в начало или конец не перемещает никакие другие элементы. - person Brian Bi   schedule 13.10.2017std::vector
лучше, к сожалению, иногда мне нужна гарантия непрерывного хранилища, которую предлагаетvector
. Меня также интересует подход с использованием настраиваемого распределителя: мне не очевидно, как настраиваемый распределитель обходит интерфейс конструктораvector
. - person BeeOnRope   schedule 13.10.2017push_back
элементов в вектор, что никогда не будет разрешено для неподвижных типов, поскольку существует потенциальное изменение размера, которое требует подвижности. Однако идея размещения объектов непосредственно во вновь созданном векторе может работать как в теории, так и на практике, поскольку последняя часть ответа ниже показывает использование конструктора, который принимает два итератора. - person BeeOnRope   schedule 14.10.2017