コンテナの要件がC ++ 03からC ++ 11に変更されました。C ++ 03には包括的な要件(コピーの構成可能性やベクターの割り当て可能性など)がありましたが、C ++ 11では各コンテナー操作に関するきめ細かい要件が定義されています(セクション23.2)。
その結果、割り当てを必要としない特定の操作(構築およびpush_back
そのような操作)のみを実行する限り、たとえば、コピー構築可能であるが割り当て不可能な型(constメンバーを持つ構造体など)をベクトルに格納できます。;でinsert
はありません)。
私が疑問に思っているのは、これは標準が現在許可していることを意味するのvector<const T>
でしょうか?const T
constメンバーを持つ構造体のように、コピー構築可能であるが割り当て可能ではないタイプである必要がある理由はわかりませんが、何かを見逃している可能性があります。
(私が何かを見逃したかもしれないと思う理由の一部は、インスタンス化しようとするとgccトランクがクラッシュして燃えることですvector<const T>
がvector<T>
、Tにconstメンバーがある場合は問題ありません)。
address
は、デフォルトのアロケーターのオーバーロードされたメンバー関数のペアです。Tがconstの場合、これら2つのオーバーロードは同じシグネチャを持ちます。これを修正する簡単な方法std::allocator<const T>
は、オーバーロードの1つを特殊化して削除することです。