2015-11-30 106 views
3

我試圖從一個函數構造一個對象,然後將它傳遞給使用它的函數(並使用它)。下面是我沒有直接使用從createObject右值引用,因爲我將回到釋放的內存參考代碼在參數構造中使用std :: move

std::unique_ptr<Object> createObject() { 
    auto myobj = std::make_unique<Object>(); 
    .. modify myobj .. 
    return std::move(myobj); 
} 

void consumeObject(std::unique_ptr<Object>&& robj) { 
    myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj)); 
} 


consumeObject(createObject()); // Is this right? 

std::move在代碼中指定的部分是否必要?如果像我在上面的代碼中所做的那樣,會傳遞一個右值以綁定到右值引用?該代碼看起來編譯就好了,但我不能看到

consumeObject(createObject()); 

consumeObject(std::move(createObject())); 
+3

你的代碼有誤:'createObject'返回一個'unique_ptr ',但'consumeObject'接受一個'Object'。你能解決這個問題嗎? – Angew

+3

在'return std :: move(myobj);'中禁止NRVO,只需'return myobj;'。 – Jarod42

+0

@Angew是的,對不起。我把這個簡單的mcve忘了一部分 – Dean

回答

3
std::unique_ptr<Object> createObject() { 
    auto myobj = std::make_unique<Object>(); 
    .. modify myobj .. 
    return std::move(myobj); 
} 

您不需要std::move按值返回本地的僅移動對象。

void consumeObject(std::unique_ptr<Object>&& robj) { 
    myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj)); 
} 

它沒有意義*使用std::forward當你使用所謂的「轉發引用」,你是不是在這裏除了。只要有&&並不意味着你應該使用std::forward。在這裏你根本不需要&&

consumeObject(createObject()); // Is this right? 

是的。


下面是代碼應該看起來像什麼樣子。請注意,您大多避免使用任何C++ 11特定語法,而代碼看起來幾乎與按值傳遞可複製對象相同。這裏只有一個地方需要新東西。

std::unique_ptr<Object> createObject() { 
    auto myobj = std::make_unique<Object>(); 
    .. modify myobj .. 
    return myobj; 
} 

void consumeObject(std::unique_ptr<Object> robj) { 
    myvector.emplace_back(std::move(robj)); 
} 


consumeObject(createObject()); 

*雙方std::forwardstd::move只是蒙上,在這裏你使用std::forward的方式恰好制定出正確的投獲得的舉動建設。但爲了便於閱讀,只能使用std::move來移動,並且只能使用std::forward轉發。

+0

謝謝,也是後續(不同的問題):http://stackoverflow.com/questions/33997586/use-of-stdmove-in-parameter-construction/ – Dean

8

std::move之間的差別並不做任何事情神奇,它只是注塑參數的右值。

由於createObject返回值,createObject()已經是一個右值(特別是一個prvalue),所以在這種情況下std::move是不必要的,你可以放心地忽略它。

+2

再次完全blobtastic命名的選擇'std :: move'罷工。 –

相關問題