2014-10-01 40 views
4
class Item { }; 

class Wrapper 
{ 
    Item i; 
    Wrapper(const Item& mI) : i{mI} { } 
    Wrapper(Item&& mI) : i{std::move(mI)} { } 
}; 

Item createItem() 
{ 
    Item result; 
    // ... 
    return result; // No `std::move` needed here 
} 

Wrapper createWrapper() 
{ 
    Wrapper result{createItem()}; // `std::move(createItem())` ? 
    return result; 
} 

createItem()有效返回而無需致電std::move如果我要用它構造一個對象,我應該移動被調用者的返回值嗎?

createWrapper()使用返回值createItem()並且想要調用Wrapper::Wrapper(Item&&)構造函數。

是否需要使用Wrapper result{std::move(createItem())};或將Wrapper result{createItem()};夠用?

回答

8

這裏不需要std::move。函數調用表達式的值已經是右值

+0

它是一個prvalue呢? – 0x499602D2 2014-10-01 13:06:56

+0

@ 0x499602D2:是的,但這與此問題無關。 – 2014-10-01 13:09:55

0

std::move需要返回對象:

BigMatrix BuildBigMatrix() 
{ 
    ... 
    return someBigMatrix; // *moved* outside of function 
} 
相關問題