2011-12-15 24 views

risposta

12

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.

+0

Ho rinviato le nostre risposte, abbiamo aggiunto una parte della risposta completa. :) – Xeo

+0

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). –

13

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 in T*.
p21 Effetti: Move-costruisce un'istanza shared_ptr da r.
p22 Postcondizioni:*this deve contenere il vecchio valore di r. 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.

+4

Sono stato coinvolto in uno stack overflow seguendo il riferimento di questo post ... –

+2

@Matthieu: Sembra che tu abbia bisogno di TCO. ; -] – ildjarn

Problemi correlati