如果我要用它构造一个对象,我应该移动一个被调用者的返回值吗?

时间:2014-10-01 08:06:06

标签: c++ c++11 return-value move move-semantics

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()};足够?

2 个答案:

答案 0 :(得分:8)

这里不需要std::move。函数调用表达式的值已经是 rvalue

答案 1 :(得分:0)

返回对象

std::move

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