2016-01-05 8 views
5

std::vector<T>::operator[] constがを返してくれることを盲目的に受け入れたが、スマートポインタのconstがどのように機能するかに照らして、今やSTLコンテナの他の部分が方法。 const std::vectorの "constness"はベクトルとその要素の両方に適用されているようですが、スマートポインタの場合は "constness"はポインターにのみ適用され、ポインターには適用されません。コンテナのconstの正確さ

明確にするために、constは、ユーザーがコンテナのサイズを変更できないことを意味するベクトルのようなコンテナがあるように思われますが、コンテナ内の要素は変更可能です。私の主な質問は:このタイプのコンテナが "const正しい"ことを防ぐ何かがありますか?

これを達成するために間接的な追加のレイヤー(例:std::vector<std::unique_ptr<T>> const)を追加することで、いくつかのハックのある回避策があるようですが、私はメンテナンスの面で少し面倒です。

スマートポインタがSTLコンテナの前の言語に組み込まれていた場合、constアクセサーはまだ今日のように定義されていますか?

+0

'mutable std :: vector'でindireclyで動作するように合成を使用する独自のクラスを定義し、publicメンバ関数を通してconstの正確さを保証することができます。 – oLen

+2

'std :: vector :: operator []'は参照を返します。 'std :: vector :: operator [] const'はconst参照を返します。 –

+0

@マーシャル・クロウ何とか私の元のドラフトから落ちた。私はそれを再び追加します。ありがとう。 – pelletjl

答えて

0

constを指定すると、コンテナのサイズは変更できないが、コンテナ内の要素は変更可能であることを意味するベクトル状のコンテナがあるはずです。

これはstd::arrayです。コンパイル時にサイズを設定します。コンストラクタ時にサイズを設定するには、提案されたdynarrayがあります。

+0

これはベクターにとって妥当と思われますが、他のSTLコンテナはどうですか?キーを追加したり削除したりすることができないstd :: mapのようなものがありますが、値は変更可能です。 – pelletjl

+0

標準は、ライブラリはすべての可能なものの集合ではありません。 –

+0

constはコンパイル時に知られている値を意味するわけではないので、新しい配列のスパン/ビューと、サイズ変更不可能な可変要素のコンテナを比較したいと思います。しかし、私に知られていない理由のために、それらのビューは 'vector'と同じ振る舞いをしています:ビューは要素のように振舞います - ' operator == 'は要素を比較し、' const'はポインタラップ。 – dyp

関連する問題