2012-11-05 8 views
14

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&&.

+1

Auf diese Weise können Sie R-Werte im Bereich verwenden. –

+0

"* 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. –

+2

Für eine zukünftige Bezugnahme wird die Eigenschaft eines Ausdrucks, der z. 'lvalue' oder 'rvalue' ist seine Wertkategorie. –

Antwort

16

Würde nicht automatisch & ausreichen?

Nein, würde es nicht. Es würde nicht die Verwendung eines r-Wert-Ausdrucks ermöglichen, der einen Bereich berechnet. auto&& wird verwendet, da es an einen l-Wert-Ausdruck oder einen r-Wert-Ausdruck binden kann. Sie müssen also den Bereich nicht in eine Variable stecken, damit er funktioniert.

Oder, um es anders auszudrücken, wäre dies nicht möglich sein:

for(const auto &v : std::vector<int>{1, 43, 5, 2, 4}) 
{ 
} 

Wäre das nicht const auto& ausreiche?

Nein, würde es nicht. A const std::vector wird nur const_iterator s zu seinem Inhalt zurückgeben. Wenn Sie nicht über den Inhalt traversieren wollen, hilft das nicht.

+0

Hoppla, eigentlich wollte ich fragen, ob 'const auto &' ausreichen würde. Wird das nicht auch etwas binden? –

+0

@sftrabbit: Es wird nicht an einen * non-const * l-Wert gebunden. Ein 'const std :: vector' gibt nur 'const'-Iteratoren zurück. –

+0

Danke. Das bedeutet, dass "auto &&" auch nützlich ist, um an etwas zu binden, ohne es zusätzlich zur Weiterleitung "const" zu machen. –