A bereichsbasierte for
Anweisung in §6.5.4 ist definiert als äquivalent zu:Warum wird eine Reichweite für Anweisung den Bereich von Auto && nehmen?
{
auto && __range = range-init;
for (auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin) {
for-range-declaration = *__begin;
statement
}
}
range-init
wo für die beiden Formen der bereichsbasierte for
definiert ist als:
for (for-range-declaration : expression) => (expression)
for (for-range-declaration : braced-init-list) => braced-init-list
(die Klausel spezifiziert weiter die Bedeutung der anderen Unterausdrücke)
Warum ist __range
gegeben th e abgeleitete Art auto&&
? Mein Verständnis von auto&&
ist, dass es nützlich ist, die ursprüngliche Wertigkeit (lvalue/rvalue) eines Ausdrucks zu erhalten, indem es durch std::forward
geht. __range
wird jedoch nirgendwo durch std::forward
weitergegeben. Es wird nur verwendet, wenn die Bereichsiteratoren als __range
, __range.begin()
oder begin(__range)
abgerufen werden.
Welchen Vorteil hat die Verwendung der "Universalreferenz" auto&&
? Würde nicht auto&
ausreichen?
Hinweis: Soweit ich das beurteilen kann, sagt the proposal nichts über die Wahl von auto&&
.
Auf diese Weise können Sie R-Werte im Bereich verwenden. –
"* Soweit ich das beurteilen kann, sagt der Vorschlag nichts über die Wahl von auto &&. *" Und dieser Vorschlag verwendet auch die Bereichsbibliothek, die es in C++ 11 nicht gibt. –
Für eine zukünftige Bezugnahme wird die Eigenschaft eines Ausdrucks, der z. 'lvalue' oder 'rvalue' ist seine Wertkategorie. –