临时左值是 std::move 的用例吗

Are temporary lvalues a use case for std::move

我有一个 class 这样的:

class Widget
{
public:
    Widget(A const& a) { /* do something */ }
    Widget(A&& a) { /* do something */ }
};

我可以这样使用:

A a{};
Widget widget{a};

如果我得出不再需要 a 的结论,我可以致电:

Widget{std::move(a)};

但是现在如果我只需要一个 A 对象来构建 widget 怎么办?我会这样做吗:

Widget widget{A{}};

Widget widget{std::move(A{})}; 

临时是右值;没有 "temporary lvalues"。 Widget widget{A{}}; 将调用 Widget(A&& a),因为 A{} 是临时的。 std::move 当你有一个左值并且你想使它成为右值时使用:

A a{};
Widget widget{std::move(a)};

另一个使用它的原因是如果你在一个接受右值的函数中并且你想将它移动到构造函数。使用函数

Widget foo(A&& a);

a 是函数体中的左值。如果您想将其转换回右值,则需要使用 std::move like

Widget foo(A&& a)
{
    Widget widget{std::move(a)};
}