Imaginez que je souhaite construire un std::vector
d'objets sans constructeur de mouvement ou de copie, tel que std::atomic<int>
. Dans ce cas, la classe std::atomic
sous-jacente a un constructeur à 1 argument qui prend un int
, ainsi qu'un constructeur par défaut (qui initialise la valeur à 0).Construction semblable à un emplacement pour std :: vector
Utilisation du std::vector<std::atomic<int>> v{1,2,3}
comme ne fonctionne pas la syntaxe initializer_list
, parce que les arguments sont d'abord convertis au type d'élément T
du vecteur dans le cadre de la création du initializer_list
et ainsi la copie ou le constructeur déplacer sera appelée.
Dans le cas particulier de std::atomic<int>
je peux DEFAULT construire le vecteur, puis muter les éléments après:
std::vector<std::atomic<int>> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
Cependant, en plus d'être laid et inefficace, ce n'est pas une solution générale puisque beaucoup Les objets peuvent ne pas offrir une mutation post-construction équivalente à ce que vous pourriez obtenir en appelant le constructeur approprié.
Y a-t-il un moyen d'obtenir le comportement "emplace-like" que je veux à la construction vectorielle?
Sérieusement, je voudrais juste utiliser 'std :: deque'. Mais si vous ne pouvez pas, la seule façon de faire ce que vous voulez est à travers un allocateur personnalisé. – Brian
@Brian - Est-ce que 'std :: deque' permet l'idiome de cette construction? – BeeOnRope
Avec 'std :: deque' vous devrez placer les éléments un par un, mais ça marchera car ajouter des éléments au début ou à la fin ne déplace aucun des autres éléments. – Brian