17.6.4.9 Argomenti delle funzioni [res.on.arguments]
1 Ciascuno dei seguenti si applica a tutti gli argomenti a funzioni definite nella libreria standard C++, se non diversamente specificato.
...
- Se un argomento funzione si lega ad un parametro di riferimento rvalue, l'applicazione può supporre che questo parametro è un riferimento unico per questo argomento. [Nota: se il parametro è un parametro generico del modulo & & e un lvalue di tipo A è associato, l'argomento si lega a un riferimento di lv lvalue (14.8.2.1) e pertanto non è coperto dalla precedente frase . - nota finale] [Nota: se un programma esegue un lvalue su un valore durante il passaggio di tale valore a una funzione di libreria (ad esempio tramite chiamando la funzione con l'argomento move (x)), il programma è chiedendo effettivamente tale funzione a tratta quel lvalue come temporaneo. L'implementazione è gratuita per ottimizzare i controlli di aliasing che potrebbero essere necessari se l'argomento era invalutato. -endnote]
Così, l'attuazione di std::vector<T, A>::operator=(vector&& other)
è consentito di supporre che other
è un prvalue. E se other
è un valore nominale, l'assegnazione automatica non è possibile.
cosa è probabile che accada:
v
sarà lasciato in uno stato (0 capacità) risorsa-less. Se v
ha già 0 capacità, questo sarà un no-op.
Aggiorna
Il latest working draft, N4618 è stato modificato per indicare chiaramente che nei requisiti MoveAssignable
l'espressione:
t = rv
(dove rv
è un rvalue), t
deve essere solo il valore equivalente di rv
prima dell'assegnazione se t
e rv
non fanno riferimento allo stesso oggetto. E a prescindere, lo stato di rv
non è specificato dopo l'assegnazione.C'è una nota aggiuntiva per ulteriori chiarimenti:
rv
deve ancora soddisfare i requisiti del componente libreria che lo sta utilizzando, anche se non t
e rv
si riferiscono allo stesso oggetto.
fonte
2012-10-29 18:55:59
@ Mark Non penso che questo sia un duplicato. Questa domanda riguarda la scrittura personale. Questa domanda riguarda ciò che garantisce la libreria standard. –
Nota che questo * non * implica l'assegnazione auto-spostamento di 'T'. – Xeo
@Xeo Ho rimosso quella linea. Grazie per aver segnalato l'errore. –