我在方法中有一个对象。该对象按值传入,在函数中修改,然后作为参数传递给std :: make_tuple,然后立即返回。
std::tuple<bool, X> func(X x)
{
// Modify x
// ...
return std::make_tuple(true, x);
}
我的问题是,将x传递给std :: make_tuple时会被移动吗?我知道如果我刚刚返回它会被移动,但是因为我将它传递给一个函数,它会被移动到函数中还是我需要将它包装在std :: move中?
答案 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
也有同样的目的。