在函数的最后一行移动

moving on the last line of a function

本文关键字:一行 移动 函数 最后      更新时间:2023-10-16

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

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

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

当x被传递给std::make_tuple时,它会被移动吗?

不,它不会被移动,因为它是左值。在一种情况下,当从函数返回左值时,可以将其视为右值,但在您的示例中则不然——请参阅C++11标准的12.8/32段。

如果你想从中移动x,你必须明确地说:

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

否,您需要明确地移动它:

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也起到了同样的作用。