2017-02-03 71 views
3

表現在下面的代碼,在foo斷言失敗:移動語義出乎意料

void bar (std::shared_ptr<int> && value) { 
} 

void foo() { 
    auto ptr = std::make_shared<int>(5); 
    bar(std::move(ptr)); 
    assert(ptr == nullptr); 
} 

共享指針仍然指向呼叫到bar後的值5。我期望撥打bar的電話使用移動語義,並將ptr留空。

我的理解缺陷在哪裏?

+1

你在哪裏期待它移動到什麼呢? – Galik

+0

'std :: move()'聲明:'template < class T > constexpr typename std :: remove_reference :: type && move(T && t);'返回值:'static_cast :: type &&>(t)'用法完美轉發,通過引用或右值引用採用't',並將其轉換爲右值引用。 –

回答

5

執行實際移動後指針將變爲空。 std::move本身不會移動任何東西。它簡單地使得將名爲對象ptr傳遞給右值參考預期函數成爲可能。

由於您實際上沒有在該功能(或任何其他位置)內移動任何內容,因此指針始終保持不動。

做到這一點(對於一個例子)

void bar (std::shared_ptr<int> && value) { 
    std::shared_ptr<int> another_ptr(std::move(value)); 
} 

,你會看到你原來的指針移動。

8

基本上,std::move()只是一個演員。

更改bar()可以查看您想要的結果。

void bar (std::shared_ptr<int> && value) 
{ 
    std::shared_ptr<int> v{std::move(value)}; 
}