移动函数的最后一行

时间:2013-07-13 19:16:39

标签: c++ c++11

我在方法中有一个对象。该对象按值传入,在函数中修改,然后作为参数传递给std :: make_tuple,然后立即返回。

std::tuple<bool, X> func(X x)
{
    // Modify x
    // ...
    return std::make_tuple(true, x);
}

我的问题是,将x传递给std :: make_tuple时会被移动吗?我知道如果我刚刚返回它会被移动,但是因为我将它传递给一个函数,它会被移动到函数中还是我需要将它包装在std :: move中?

2 个答案:

答案 0 :(得分:3)

  

将x传递给std :: make_tuple?

不,它不会被移动,因为它是左值。有一种情况,当从函数返回左值时,左值可以被视为右值,但在你的例子中却没有 - 参见C ++ 11标准的第12.8 / 32段。

如果您希望移动x,则必须明确说明:

return std::make_tuple(true, std::move(x));

答案 1 :(得分:0)

不,你需要明确地移动它:

return std::make_tuple(true, std::move(x));

但是,您可能更想要optional *:

std::optional<X> func(X x)
{
    // modify x
    return std::move(x);
}

允许通过移动构造可选对象,所以这就像你得到的“movy”一样。

*)optional将来会出现在C ++标准中;与此同时,boost::optional也有同样的目的。