あなたが書くとき:
auto blah = map[key];
operator[] は で呼び出されkey
、値を返します。
あなたが書くとき:
map[key] = blah;
次に、 operator[key] が aで呼び出され、値が返されます。その後、引数を指定key
して値に対して operator= が呼び出されます。blah
これは、マップに対して実際に読み取りまたは書き込みを行っている場所を検出するのが難しい場合があることを意味します。
ただし、通常、読み取りの場合、ケースはvalue const& operator[] const
呼び出されたものにフォールバックする可能性がありますが、書き込み中はvalue& operator[]
constマーカーなしになります。したがって、const 指定子によって演算子をオーバーロードしようとする場合があります。2 つの operator[]s、1 つの const、1 つの非 const を提供し、後者でのみサイズをインクリメントします。
これは単純で簡単ですが、常に適切に機能するとは限りません。ある時点で誤って「operator [] as read」を呼び出す可能性がありますが、その時点でコンパイラによって決定可能な const 制約がありません。現時点では、いつ、どのように、それが可能であるかを正確に言うことはできませんが、consness に注意を払わなければ、非常に簡単にヒットできると思います。
それをヒットした場合、私が知っている唯一のオプションは、非 const モードで戻り値のラッパーを提供し、const モードでは通常のままにすることです。
myMap::valueType const & operator[](key...) const
mymap::wrapper<myMap::valueType>& operator[](key...)
ラッパーは Map への ref& を記憶し、KEY を記憶し、そのラッパーは暗黙的な変換 TO-valueType を提供し、代入演算子 FROM-valueType-TO-wrappertype を提供します。暗黙的な valuetype への変換は、指定されたキーからのマップからの読み取りを実行し、te カウンターをインクリメントしませんが、operator=(from-valuetype, to-wrappertype) はマップへの書き込みを実行します。
それは確かに機能しますが、このアプローチは時代遅れかもしれません。私は c'11 からの変更に精通していないので、より適切なオプションが利用できるようになった&&
可能性があります。
valueType&& operator[](key)
も可能です----しかし、私にはわかりません。return-a-transparent-wrapper アプローチしか知りません。
編集: これは、読み取りと書き込みの両方をサポートし、これら 2 つを区別する適切な operator[] オーバーロードの素敵な (完全に見える) 例です。
stack: 添え字演算子に割り当てられた値を使用して何かを行う方法は?