1

我有一个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{})}; 
4

1 回答 1

4

临时值是右值;没有“临时左值”。Widget widget{A{}};将调用Widget(A&& a)asA{}是一个临时的。std::move当你有一个左值并且你想把它变成一个右值时使用:

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

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

Widget foo(A&& a);

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

Widget foo(A&& a)
{
    Widget widget{std::move(a)};
}
于 2016-03-10T14:58:31.430 回答