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

时间:2016-03-10 14:53:19

标签: c++ move-semantics copy-assignment move-assignment-operator

我有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的{​​{1}}对象怎么办?我会这样做:

widget

Widget widget{A{}};

1 个答案:

答案 0 :(得分:4)

临时是左值;没有"临时左值"。由于Widget widget{A{}};Widget(A&& a)A{}会致电std::move。如果你有一个左值,你想使用A a{}; Widget widget{std::move(a)}; ,你想像它一样使它成为右值:

Widget foo(A&& a);

使用它的另一个原因是,如果你在一个带rvalue的函数中,并且你想将它移动到构造函数中。有了这个功能

a

std::move是函数体中的左值。如果您想将其转换回右值,则需要使用Widget foo(A&& a) { Widget widget{std::move(a)}; } 之类的

Sys.OleObject