È una scelta progettuale/trade-off deliberata.
In primo luogo, non è necessariamente possibile scoprire se il functionoid passato a async
prende i suoi argomenti per riferimento oppure no. (Se non si tratta di una funzione semplice ma di un oggetto funzione, ad esempio potrebbe avere un operatore di chiamata con funzione sovraccaricata. Quindi, async
non può dire, "Ehi, lasciami controllare cosa vuole la funzione obiettivo, e farò il giusto cosa."
Quindi la domanda di progettazione è, prende tutti gli argomenti per riferimento se possibile (vale a dire se sono lvalue), o fa sempre delle copie? Fare copie è la scelta sicura qui: una copia non può diventare penzoloni e una copia non può esibire condizioni di gara (a meno che non sia davvero strano). Quindi questa è la scelta che è stata fatta: tutti gli argomenti sono copiati di default.
Tuttavia, il meccanismo è stato scritto in modo tale che in realtà non riesce a passare gli argomenti a un parametro di riferimento non costante. Questa è un'altra scelta per la sicurezza: altrimenti, la funzione che ti aspetteresti di modificare il tuo lvalue originale modifica invece la copia, portando a bachi molto difficili da rintracciare.
Ma cosa succede se si vuole davvero il parametro di riferimento non costante? Cosa succede se prometti di prestare attenzione a riferimenti e condizioni di gara penzoloni? Questo è ciò che std :: ref è per. È un esplicito opt-in per la pericolosa semantica di riferimento. È il tuo modo di dire: "So cosa sto facendo qui".
fonte
2013-08-21 14:48:36
Non è necessario digitare 'std :: reference_wrapper'. Usa 'std :: ref'. – chris
Io uso 'std :: ref', ma grazie per un suggerimento :) – lizarisk
Dovrai scavare nel codice sorgente di libstdC++ se ti interessa il motivo di questo errore: http: //gcc.gnu .org/onlinedocs/gcc-4.8.1/libstdC++/api/a01256_source.html I numeri di riga da esaminare sono negli errori. In bocca al lupo. – jrok