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&&
.
In questo modo è possibile utilizzare i valori r nell'intervallo. –
"* 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. –
Per riferimento futuro, la proprietà di un'espressione descritta da ad es. 'lvalue' o 'rvalue' è la sua categoria di valore. –