2017-05-25 1 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で実装されていない任意の特定の理由がある:のstd ::ベクトルは、次の2つのコンストラクタを提供しますか?理由があるはずだと思うけど、ただちに見ることはできません。

答えて

4

countまたはデフォルトの要素(別名value)も指定せずにallocatorを渡すことはできないため、

count0にすると、あいまいなエラーになります。

C++がPythonのようなparamsの名前を付けていれば、ずっと簡単になります。 Boost has such a libraryしかし、これもいくつかのランタイムオーバーヘッドが発生します:(今はどれくらい覚えていないのですか?)テストではこのLibをよく使用しますが、パフォーマンスは重要ではありません...

+1

C++には、パラメータリストの後に出現するものを指定するときに、それを吸い上げて余分な引数を与えなければならない場所がたくさんあるような気がします。 1つの例は、(テンプレート引数の) 'std :: priority_queue'の比較関数を指定することです。アロケータだけを指定するのは本当によく使われるケースなので、彼らが決定したと思いますか? – gowrath

+0

@gowrathはい、時にはPythonの名前付きparamsが本当に欠けています:) – ovanes

3

理由は、 2番目の型を使用するには、型はコピーコンストラクタブルでなければならず、valueのデフォルト引数を使用する場合は、デフォルトで構成可能でなければなりません。

質問に表示されているコンストラクタは、C++ 11までしか存在しなかったことに注意してください。この2つのシナリオを区別するだけで十分でした(std::vectorに格納されているすべての型は、構築可能)。 C++ 11の導入の動きの意味を、第二コンストラクタは、さらに分割された:std::vectorは、もはやコピーconstructibeようにそれに含まれるタイプを必要とするためません

explicit vector(size_type count); 

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

。移動可能性が十分である。したがって、count-onlyコンストラクタはデフォルトのコンストラクタビリティーを必要としますが、コンストラクタビリティは必要ありません。


std::vectorコンストラクタの進化は、実際にはかなり複雑です。彼らがどれだけ進化したかを見るにはtheir page on cppreferenceを見てください。その進化には、オプションのallocatorパラメータをC++ 14のカウント専用コンストラクタに追加することが含まれています。これは誤って省略されていました。

関連する問題