结合std :: vector Default和Fill Constructor

时间:2017-05-25 19:14:29

标签: c++ c++11 vector

我有一个相当快的问题。 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实现默认构造函数?我可以想象必须有一个理由,但我不能马上看到一个。

2 个答案:

答案 0 :(得分:4)

因为您不能只传递allocator,而不提供count或默认元素(又名value)?

count置于0会导致歧义错误。

如果C ++像Python一样命名params会更简单。 Boost has such a library,但同样会引发一些运行时开销:((现在还记得多少)我经常在测试中使用这个Lib,但不是性能很重要的地方......

答案 1 :(得分:3)

原因是构造函数对向量中包含的类型提出了不同的要求。要使用第二个类型,类型必须是可复制的,如果使用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不再要求其包含的类型是copy-constructibe;移动构造性就足够了。因此,只计数构造函数需要默认的可构造性(但不是复制构造性),而count + prototype构造函数需要复制构造性(但不是默认的构造性)​​。

std::vector构造函数的演变非常复杂。请参阅their page on cppreference,了解他们的进化程度。这种演变包括向C ++ 14中的仅计数构造函数添加一个可选的allocator参数,这是(我假设)错误地省略了。