组合 std::vector 默认值和填充构造函数
Combining std::vector Default and Fill Constructor
我有一个相当快的问题。std::vector 提供以下两个构造函数:
explicit vector( const Allocator& alloc = Allocator()); // default constructor
explicit vector( size_type count, // fill constructor
const T& value = T(),
const Allocator& alloc = Allocator());
对于填充构造函数中的第一个参数,默认构造函数未以默认值 0 实现,是否有任何特殊原因?我可以想象一定有一个原因,但我不能立即看到一个。
因为你不能只传递一个allocator
,而不提供count
或默认元素(又名value
)?
将count
置于0
将导致歧义错误。
如果C++命名像 Python 这样的参数会简单得多。Boost 有这样一个库,但这同样会产生一些运行时开销:((现在不记得多少了)我经常在测试中使用这个 Lib,但不是在性能很重要的地方......
原因是构造函数对向量中包含的类型提出了不同的要求。要使用第二个,类型必须可复制可构造,并且如果您使用value
的默认参数,它也必须是默认可构造的。第一个构造函数对包含的类型没有这样的要求。
请注意,您在问题中显示的构造函数仅在 C++11 之前存在。在那里,区分这两种情况就足够了(因为存储在std::vector
中的任何类型都必须是可复制的)。C++11 引入了移动语义,第二个构造函数进一步拆分:
explicit vector(size_type count);
vector(
size_type count,
const T& value,
const Allocator& alloc = Allocator()
);
这是因为std::vector
不再要求其包含的类型是复制构造的;移动可构造性就足够了。因此,仅计数构造函数需要默认可构造性(但不是复制可构造性),计数 + 原型构造函数需要复制可构造性(但不是默认可构造性)。
std::vector
构造函数的演变确实非常复杂。查看他们在 cpppreferences 上的页面,看看他们进化了多少。这种演变包括在 C++14 中向仅计数构造函数添加一个可选的allocator
参数,该参数(我假设)被错误地省略了。
相关文章:
- 填充上编译器生成的复制构造函数之间的不一致
- 使用所述填充构造函数初始化向量中的向量
- C++:SFINAE 来区分填充和范围构造函数?
- 如何在C++11中区分填充构造函数和范围构造函数
- 用构造函数调用填充向量
- 组合 std::vector 默认值和填充构造函数
- 通用矢量的填充构造函数
- 为什么 C++11 从 std::vector 的填充构造函数的原型中删除了默认值?
- 通过指针填充自定义的类 - 与构造函数的麻烦
- 如何基于构造函数参数填充常量成员数组
- C++:在类构造函数中填充向量后,向量成员被销毁
- 结构错误的构造函数(调用类的构造函数 denconstructor,用于填充结构)
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 异常构造函数来填充字符串流
- 使用派生类构造函数填充基类受保护成员
- 尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?
- 将字符串的填充构造函数与初始值设定项列表一起使用
- 用构造函数填充向量的C++奇怪行为
- std::initializer_list构造函数除了用值填充一些容器之外,还有什么用
- 在类的构造函数初始值设定项中填充 std::array