Questo codice non funziona, poiché l'auto & è un riferimento const. [emphasis mine]
Il tuo ragionamento non regge. In un ciclo for-range, ciò che dichiari (qui, auto& ab
) è non associato all'espressione di intervallo (qui, {a,b }
). Invece, ab
verrà inizializzato dagli elementi dell'intervallo, non dall'intervallo stesso.
Invece l'errore deriva dal chiamare std::sort
con i parametri ab.begin()
/ab.end()
, che può essere facilmente osservato commentando il corpo del ciclo. Come sottolineato da RMartinho, gli elementi di std::initializer_list<std::vector<double>>
non sono modificabili e non è possibile ordinare un contenitore const
(elementi std::sort
utilizzando le mosse, non è possibile assegnare a un elemento const
).
Supponendo che si desidera (in modo indipendente) ordinare entrambi i vettori, si può fare:
for(auto& ab: { std::ref(a), std::ref(b) })
std::sort(std::begin(ab.get()), std::end(ab.get()));
Si noti che in base alle leggi di deduzione modello di argomento, auto&
va bene qui e auto
sarà dedotta al const std::reference_wrapper<std::vector<double>>
, cedendo std::reference_wrapper<std::vector<double>> const&
come il tipo di ab
.
fonte
2012-02-07 12:16:08
Qual è '{a, b}'? –
@Lightness è un 'std :: initializer_list>'. il problema qui è che gli iteratori di un elenco di inizializzazione sono * sempre * 'const'. –
Quindi eccoci. Mi chiedo se qualche ralue forwarding magic possa aiutare qui. –