これにより、次のことが可能になります。
std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);
しかし、value_type
const を使用する必要があるため、それはより困難ですremove_const
。
変更可能な値を取得したくない場合は、 value_type
const であるかどうかは関係ありません。
const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference ref = *iter;
これらは両方とも定数反復子と非定数反復子に対して機能し、どちらも定数であるかどうかに関係value_type
なく機能しますが、最初の例は定数反復子value_type
が非定数である場合にのみ機能します。
イテレータの基礎となる const の正しい型をどのように取得することになっていますか?
反復子は必ずしもそれ自体の基になる型を持っているとは限りません。通常、反復子は何らかの範囲またはコレクションを参照し、そのコレクションは基になる型を持つものです。例:std::list<int>::const_iterator
はvalue_type
isstd::list<int>::value_type
で、どちらはint
notconst int
です。
*iter
とにかく、基礎となる型が何であるかを必ずしも知りたいとは限りません。結果が何であるかを知りたい可能性が高く、それがあなたにiterator_traits<I>::reference
伝えます。