2017-05-25 64 views
3

我有一个相当快的问题。性病::矢量提供了以下两个构造函数:组合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在填充构造函数的第一个参数的默认值来实现什么特别的原因?我可以想象一定有一个理由,但我不能立即看到一个。

回答

4

因为你不能只通过一个allocator,而不提供count或默认元素(又名value)以及?

count设置为0将导致模糊性错误。

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

+1

我觉得在C++中有很多地方需要吸收它,并且当你想要指定稍后在参数列表中出现的参数时提供额外的参数。一个例子是为'std :: priority_queue'指定比较函数(在模板参数中)。我猜他们做出这个决定是因为指定分配器是一个非常常见的用例吗? – gowrath

+0

@gowrath是的,我有时真的很想念Python的命名参数:) – ovanes

3

原因是构造函数的地方对于vector中包含的类型有不同的要求,要使用第二个类型,这个类型必须是可复制的,如果你使用默认参数value,它也必须是default-constructible。第一个构造函数不会在包含类型

请注意,您在问题中显示的构造函数只存在于C++ 11之前,在那里,足以区分这两种情况(因为存储在std::vector中的任何类型必须是copy- constructible)。 C++ 11个引入了移动语义,并且第二构造是进一步分裂:

explicit vector(size_type count); 

vector(
    size_type count, 
    const T& value, 
    const Allocator& alloc = Allocator() 
); 

这是因为std::vector不再需要其包含的类型被复制constructibe;移动建构性就足够了。因此,只有计数的构造函数需要默认的可构造性(但不能复制可构造性),并且count + prototype构造函数需要复制可构造性(但不是默认的可构造性)。


std::vector构造演化真的是相当复杂的。看到their page on cppreference看看他们已经发展了多少。这个演变包括将一个可选的allocator参数添加到C++ 14中只有计数的构造函数中,这是(我假设)错误地省略了。