C++ 组合std::vector Default和Fill构造函数

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(),

我有一个相当快的问题。vector提供了以下两个构造函数:

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的命名参数:)