2013-06-17 15 views
14

Si consideri il seguente codice:È stato svuotato uno shared-from shared_ptr?

struct Bar 
{ 
    std::shared_ptr<int> MemberFunction() 
    { 
     return std::move(m_memberVariable); 
    } 

    std::shared_ptr<int> m_memberVariable; 
}; 

si garantisce che la std::move da un shared_ptr<T> sarà effettivamente rimuovere il riferimento nella variabile membro? O dovrei copiare, chiaro e copia tornare a garantire questo *

Chiaramente, nel caso di unique_ptr<T> lo fa la cosa giusta (non può forse non lo fanno), ma non lo standard garanzia che un std::move D da shared_ptr rilascia il suo riferimento? [Quando è una variabile membro, statica o globale, i locali non contano come vanno fuori portata]

* possibilmente "swap e ritorno" è meglio di "copiare, chiaro e ritorno ".

+0

Vuoi in pratica o vuoi capitolo e versetto dallo standard? In pratica, anche se lo standard mancasse insistendo su questo, qualsiasi compilatore che lo facesse sarebbe considerato malvagio. – Yakk

risposta

17

Hai davvero questa garanzia. Da 20.7.2.2.1/21-22:

shared_ptr(shared_ptr&& r) noexcept;

template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;

Effetti: Move-costruisce un'istanza shared_ptr da r.

Postcondizioni: *this deve contenere il vecchio valore di r. r deve essere vuoto. r.get() == 0.

+0

Perfetto, grazie –

Problemi correlati