想象一下,我想构建一个没有移动或复制构造函数的固定大小的std::vector
,例如std::atomic<int>
。在这种情况下,底层的std::atomic
类有一个1-arg构造函数,它接受一个int
以及一个默认构造函数(将值初始化为0)。std :: vector的安置式构造
使用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;
然而,除了是难看和低效的,这不是因为许多一般的溶液对象可能不会提供相当于通过调用相应的构造函数可以获得的构造后变化。
有没有什么办法可以获得我想要在矢量构建中使用的“类似于emplace的”行为?
说真的,我只是使用'std :: deque'。但是如果你不能,唯一的办法就是通过自定义分配器来做你想做的事情。 – Brian
@布莱恩 - 'std :: deque'是否允许这种构造方式? – BeeOnRope
对于'std :: deque',你必须逐个放置元素,但是它会起作用,因为向开始或结束添加元素不会移动任何其他元素。 – Brian