decltype(*it)イテレータの値型、またはそれへの左辺値参照、または他の何かですか?
は左辺値なので、左辺値の参照だと思いますが、よくわかり*itません。
注:私の場合、itはBidirectionIteratorですが、一般的なケースに自由に答えてください。
decltype(*it)イテレータの値型、またはそれへの左辺値参照、または他の何かですか?
は左辺値なので、左辺値の参照だと思いますが、よくわかり*itません。
注:私の場合、itはBidirectionIteratorですが、一般的なケースに自由に答えてください。
*it左辺値であることが最も確実に保証されているわけではありません。入力イテレータは右辺値を返す場合があります。
*it必ずしも左辺値ではありません。フォワードイテレータのみがその要件を持っています。
イテレータ(§24.2.2)は、 (およびその他の無関係なものを)*it返す有効な式である必要があります。iterator_traits<Iterator>::referenceこれについては他に何も言われてreferenceおらず、参照型である必要はありません†。
入力イテレータ(§24.2.3)は、値型に変換可能なもの*itを返す有効な式である必要があります。
ただし、フォワードイテレータには次の要件があります(§24.2.5段落1)。
—
Xが可変イテレータの場合、は;referenceへの参照です。が定数イテレータのT場合、はへの参照です。Xreferenceconst T
(Tこれがイテレータの値型です)
これは*it参照である必要があります。つまり、glvalueである必要があります(つまり、prvalueにすることはできませんが、moveイテレータの場合のようにxvalueにすることができます)。
より高いイテレータカテゴリは、関連する要件を追加しません。
†は、それを少し循環定義にするreferenceタイプとして定義されていますが、制限はありません。*it