私はクラスライブラリを開発しているので、これを求めています。(cplusplus.comで見ることができるように)C ++ 98では、std::vector::resize
関数から1つのバージョンしかありませんでした:
void resize (size_type n, value_type val = value_type());
このようにして、2番目の引数を指定するかどうかに関係なく、関数が機能します。しかし、C ++ 11では、2つの異なるバージョンに変更されています。
void resize (size_type n);
void resize (size_type n, const value_type& val);
これには特別な理由がありますか?
の場合std::vector::resize
、C ++ 11より前でval
は、のデフォルト引数は常に値で初期化されており、追加された要素も値で初期化されているため、そこからコピーされます。C ++ 11以降、カスタムアロケーターを提供することでこれを回避できます。
- 追加のデフォルト挿入要素が追加される(以降C ++ 11)
(私の強調)
デフォルトでは、これはbyのようにplacement-newを呼び出します
::new((void*)p) T()
(つまり、pが指すオブジェクトをvalue-initializeします)。値の初期化が望ましくない場合、たとえば、オブジェクトが非クラスタイプであり、ゼロ化が必要ない場合は、カスタムAllocator :: constructを提供することで回避できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加