2017-05-25 88 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中只有計數的構造函數中,這是(我假設)錯誤地省略了。