【发布时间】:2017-10-13 19:06:10
【问题描述】:
假设我想构造一个固定大小的对象std::vector,而不需要移动或复制构造函数,例如std::atomic<int>。在这种情况下,底层 std::atomic 类有一个 1-arg 构造函数,它接受一个 int,以及一个默认构造函数(将值初始化为 0)。
使用像std::vector<std::atomic<int>> v{1,2,3} 这样的initializer_list 语法不起作用,因为作为initializer_list 创建的一部分,参数首先转换为向量的元素类型T,因此复制或移动构造函数将被调用。
在 std::atomic<int> 的特殊情况下,我可以默认构造向量,然后在之后改变元素:
std::vector<std::atomic<int>> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
但是,除了丑陋和低效之外,它不是一个通用的解决方案,因为许多对象可能无法提供与调用适当构造函数所获得的构造后突变等效的功能。
有没有什么方法可以在向量构造中获得我想要的“emplace-like”行为?
【问题讨论】:
-
说真的,我只会使用
std::deque。但如果你不能,唯一的方法就是通过自定义分配器来做你想做的事。 -
@Brian -
std::deque允许这种构造成语吗? -
使用
std::deque,您必须一个一个地放置元素,但它会起作用,因为在开头或结尾添加元素不会移动任何其他元素。 -
@Brian - 对,至少在这方面
std::vector更好,不幸的是,有时我需要vector提供的连续存储保证。我也对自定义分配器方法感兴趣:自定义分配器如何绕过vector构造函数接口对我来说并不明显。