临时左值是 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)};
}
我有一个 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)};
}