2013-06-17 16 views
14

Rozważmy następujący kod:Czy przeniesiony z shared_ptr jest gwarantowany do opróżnienia?

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

    std::shared_ptr<int> m_memberVariable; 
}; 

To jest zagwarantowane, że std::move z shared_ptr<T> rzeczywiście usunąć odwołanie w zmiennej członkiem? Czy mam kopiowanie, jasne i powrócić kopię tego zagwarantować *

Oczywiście w przypadku unique_ptr<T> to jednak słusznie (nie może on być może nie), ale nie standardowy gwarancyjny że std::move d od shared_ptr uwalnia odniesienie? [Gdy jest to zmienna członkiem, statyczny lub globalny, mieszkańcy nie mają znaczenia, ponieważ wykraczają one poza zakresem]

* ewentualnie „wymiany i powrót” jest lepsze niż „kopia, jasny i powrotu ".

+0

Czy chcesz w praktyce, czy chcesz rozdział i werset od normy? W praktyce, nawet jeśli standardowi brakowało nalegań na to, każdy kompilator, który to zrobił byłby uważany za zły. – Yakk

Odpowiedz

17

Rzeczywiście masz tę gwarancję. Od 20.7.2.2.1/21-22:

shared_ptr(shared_ptr&& r) noexcept;

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

Efekty: Move-konstruuje shared_ptr wystąpienie z r.

Postgrecje: *this zawierają starą wartość r. r będzie puste. r.get() == 0.

+0

Idealne, dzięki –

Powiązane problemy