2012-11-05 8 views
14

A gamma-riferiscono for economico è definita in §6.5.4 equivalente a:Perché un'istruzione basata su intervallo prende l'intervallo con auto &&?

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, 
      __end = end-expr; 
     __begin != __end; 
     ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
    } 
} 

dove range-init è definito per le due forme di gamma-based for come:

for (for-range-declaration : expression)   => (expression) 
for (for-range-declaration : braced-init-list) => braced-init-list 

(la clausola specifica ulteriormente il significato delle altre sottoespressioni)

Perché è __range dato e dedotto il tipo auto&&? La mia comprensione di auto&& è che è utile per preservare la valutazione originale (valore/valore) di un'espressione passandola attraverso std::forward. Tuttavia, __range non è passato da nessuna parte attraverso std::forward. Viene utilizzato solo quando si ottengono gli iteratori di intervallo, come uno di __range, __range.begin() o begin(__range).

Qual è il vantaggio di utilizzare il "riferimento universale" auto&&? auto& non sarebbe sufficiente?

Nota: per quanto posso dire, the proposal non dice nulla sulla scelta di auto&&.

+1

In questo modo è possibile utilizzare i valori r nell'intervallo. –

+0

"* Per quanto posso dire, la proposta non dice nulla sulla scelta di auto &&. *" E quella proposta usa anche la libreria di intervalli, che non esiste in C++ 11. –

+2

Per riferimento futuro, la proprietà di un'espressione descritta da ad es. 'lvalue' o 'rvalue' è la sua categoria di valore. –

risposta

16

Non disponibile & automatico?

No, non lo sarebbe. Non consentirebbe l'uso di un'espressione di valore r che calcola un intervallo. auto&& viene utilizzato perché può associare a un'espressione di valore l o un'espressione di valore r. Quindi non è necessario inserire l'intervallo in una variabile per farlo funzionare.

O, per dirla in altro modo, questo non sarebbe stato possibile:

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

Non sarebbe const auto& bastano?

No, non lo sarebbe. A const std::vector restituirà sempre solo const_iterator s ai suoi contenuti. Se si desidera eseguire una traversal non-const sui contenuti, ciò non sarà di aiuto.

+0

Oops, in realtà volevo chiedere se 'const auto &' sarebbe sufficiente. Anche questo non si legherà a nulla? –

+0

@sftrabbit: non si associa a un valore * non-const * l. Un 'const std :: vector' restituirà solo' iteratori const '. –

+0

Grazie. Ciò significa che 'auto &&' è anche utile per legare a qualsiasi cosa senza renderlo 'const', oltre all'inoltro. –

Problemi correlati