2015-01-23 13 views
16

Si supponga una ha una funzione con il seguente prototiposi muove due volte in una sola espressione piena ammessi

template<typename T>  
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr); 

La funzione può restituire (una versione spostato di) dell'oggetto che è stato passato ad esso, o una completamente diversa oggetto.

È legale C++ utilizzare questa funzione come segue?

std::unique_ptr<Widget> pw(new Widget()); 

pw = process_object(std::move(pw)); 

Se ricordo bene, c'è una regola C/C++ che proibisce modifica di un oggetto più di una volta in una singola espressione completa. Questa regola si applica qui? Se sì, c'è un modo per esprimere questo idioma in modo diverso in una singola riga?

Cosa succede se si sostituisce dal disprezzato std::auto_ptr?

+0

Intendevi 'process_object' per prendere un argomento' std :: unique_ptr && '? – Walter

+0

@Walter Perché te lo aspetti? Il passaggio della proprietà di un 'unique_ptr' è fatto in base al valore. –

+0

'auto_ptr' è deprecato. – Walter

risposta

20

È legale C++ utilizzare questa funzione come segue?

Sì, va bene.

Se ricordo correttamente, esiste una regola C/C++ che vieta di modificare un oggetto più di una volta in una singola espressione completa.

Non proprio. Non è possibile modificare un oggetto più di una volta (o modificarlo e utilizzarne il valore) con accessi non eseguiti.

Questa regola si applica qui?

No. La valutazione dell'argomento della funzione è preceduta dalla chiamata della funzione, che viene sequenziata prima dell'assegnazione. Quindi i due accessi sono sequenziati, e tutto va bene.

+7

Plug vergognoso: ho scritto un articolo su [le regole di sequenziamento] (http://josephmansfield.uk/articles/c++-sequenced-before-graphs.html) che aiuta a visualizzare le regole con i grafici. –

+2

@JosephMansfield Voglio comprarti una birra. – bolov