C++ 组合std::vector Default和Fill构造函数
我有一个相当快的问题。vector提供了以下两个构造函数:C++ 组合std::vector Default和Fill构造函数,c++,c++11,vector,C++,C++11,Vector,我有一个相当快的问题。vector提供了以下两个构造函数: explicit vector( const Allocator& alloc = Allocator()); // default constructor explicit vector( size_type count, // fill constructor const T& value = T(),
explicit vector( const Allocator& alloc = Allocator()); // default constructor
explicit vector( size_type count, // fill constructor
const T& value = T(),
const Allocator& alloc = Allocator());
是否有任何特殊原因导致默认构造函数没有使用fill构造函数中第一个参数的默认值0来实现?我可以想象一定有原因,但我不能立即看到原因。因为你不能只传递一个
分配器,而不提供计数或默认元素(aka值
)
将count
置于0
将导致歧义错误
如果C++命名PARAMs为Python,那么P>会更简单。但这同样会产生一些运行时开销:((现在不记得有多少)我经常在测试中使用这个库,但不是在性能很重要的地方…原因是构造函数对向量中包含的类型提出了不同的要求。要使用第二个库,类型必须是可复制可构造的,如果使用value
的默认参数,它也必须是可默认构造的irst构造函数对包含的类型没有这样的要求
请注意,您在问题中显示的构造函数只在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
构造函数的演化非常复杂。看看它们演化了多少。这种演化包括向C++14中的count only构造函数添加一个可选的allocator
参数,这是(我假设)错误地省略。我觉得C++中有很多地方,当您想指定参数列表后面的一个地方时,您必须吸吮并提供额外的参数。一个例子是指定<代码> STD::PrimyIyQueQue(在模板参数中)的比较函数。。我想他们之所以做出这个决定,是因为只指定分配器是一个非常常见的用例?@gowrath是的,有时我真的很怀念Python的命名参数:)