Se I move
shared_ptr
'a' in shared_ptr
'b' è 'a' garantito come null?Lo stato di qualsiasi classe standard dopo lo spostamento è stato specificato?
Lo stato di della classe standard dopo lo spostamento è stato specificato?
Se I move
shared_ptr
'a' in shared_ptr
'b' è 'a' garantito come null?Lo stato di qualsiasi classe standard dopo lo spostamento è stato specificato?
Lo stato di della classe standard dopo lo spostamento è stato specificato?
In generale 17.6.5.15/1 vale:
Oggetti di tipo definito nella libreria standard C++ possono essere spostati da (12.8). Le operazioni di spostamento possono essere specificate esplicitamente o generate implicitamente. Se non diversamente specificato, tali oggetti spostati da devono essere collocati in uno stato valido ma non specificato.
Così è possibile chiamare qualsiasi funzione che non richiede alcuna condizione preliminare.
Se specificato, vale what @Xeo said.
Se specificato, è sotto il loro costruttore e (se assegnabile) subclaus dell'operatore di assegnazione. Per shared_ptr
abbiamo:
§20.7.2.2.1 [util.smartptr.shared.const]
shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
P20 Nota: Il secondo costruttore non partecipa risoluzione di sovraccarico a meno
Y*
è convertibile inT*
.
p21 Effetti: Move-costruisce un'istanzashared_ptr
dar
.
p22 Postcondizioni:*this
deve contenere il vecchio valore dir
.r
deve essere vuoto.r.get() == 0
.
Gli operatori di assegnazione di shared_ptr
sono fondamentalmente descrive con copia-e-swap con una temporanea costruita dai (spostato se rvalue) argomento:
§20.7.2.2.3 [util.smartptr.shared.assign]
shared_ptr& operator=(shared_ptr&& r) noexcept;
template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r) noexcept;
p4 Effetti : Equivale a
shared_ptr(std::move(r)).swap(*this)
.
p5 Resi:*this
.
Se non specificato, vale what @AProgrammer said.
Sono stato coinvolto in uno stack overflow seguendo il riferimento di questo post ... –
@Matthieu: Sembra che tu abbia bisogno di TCO. ; -] – ildjarn
Ho rinviato le nostre risposte, abbiamo aggiunto una parte della risposta completa. :) – Xeo
Dopo uno spostamento è meglio lasciare il vecchio oggetto fuori portata o inizializzarlo in modo esplicito prima di riutilizzarlo. Affidarsi a un metodo senza prerequisiti diventerebbe un problema di manutenzione (ha detto l'uomo che tiene l'ascia). –