2012-10-28 10 views
5

elememt型Tのstd :: vectorの要件がC++ 03からC++ 0xに変更されていることに気付きました。 Tはもはやコピーコンストラクタブルである必要はありませんが、コンストラクタビリティは十分です。ベクトル要素は移動可能である必要がありますか?

潜在的に再割り当てしなくても、Tには必要ですか?

vector<boost::scoped_ptr<int>> x(numberElements); 

ここに移動する必要はありません。仕様は何を表していますか?

+0

実際の実装では不動のオブジェクトでうまく動作するかもしれませんが、標準では必須です。 –

+0

@kerrekこれは 'new'配列に比べて大きな機能損失であると私には思われます。要件の理由は何ですか? –

+0

「一回のみ」の割り当てには常に 'std :: unique_ptr p(new T [N])'を持つことができます。要件は標準的なコンテナの要件の一部にすぎません...私はなぜ*それがコンセプトを単純に保つ以外に、多くの特別な例外を含んでいないのか分かりません。例えば、C++ 11で生成されたコードとまったく同じコードは 'std :: vector >'を使用することができます。 –

答えて

3

23.3.6.2 [vector.cons]パラグラフ4によると、使用しているコンストラクタにはDefaultInsertableが必要です。コンストラクタは要求表のコンストラクタの1つではないため、さらにCopyInsertableを要求するため、追加の要件はありません。段落13 [container.requirements.general] 23.2.1によると、DefaultInsertableは、次の式がよく形成されることを意味する:

それはそう
allocator_traits<A>::construct(m, p); 

が、これは答えが使用アロケータAに依存していることを意味します。私は、20.6.7.2 [allocator.uses.construction]のより深い意味を分析するのは夢中です。インストラクターのエスケープをやりましょう:このパラグラフが意味することを決定することは、練習として残されています!

+0

+1 *このコンストラクタの 'T'には' DefaultInsertable'だけが必要です。 'T'は' MoveConstructible'でも 'CopyConstructible'でもある必要はありません。デフォルトアロケータが使用されるとき、 'DefaultInsertable'は' DefaultConstructible'を意味します。ヨハネスのコードは準拠しています( 'boost :: scoped_ptr 'が有効であると仮定し、私たちは皆それが意味すると思うことを意味します)。 –

+0

@howardああ、説明のおかげで。今私は自分のコードを心配することなく眠ることができます。 –

+0

@ JohannesSchaub-litb:ポータブルではないと言いました。 ;-)私はこの時点でどれくらい多くの実装が正しいかは分かりません。私はlibC++があることを知っています。私は他の実装があなたの例で動作することを聞くことに興味があります。 –

関連する問題