2

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

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

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

4

2 回答 2

3

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

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

如果你想x被搬离,你必须明确地说:

return std::make_tuple(true, std::move(x));
于 2013-07-13T19:19:03.623 回答
0

不,您需要明确移动它:

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

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

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

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

*)optional将来会成为 C++ 标准;同时,boost::optional服务于相同的目的。

于 2013-07-13T19:18:55.937 回答