Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 临时左值是std::move的用例吗_C++_Move Semantics_Copy Assignment_Move Assignment Operator - Fatal编程技术网

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

C++ 临时左值是std::move的用例吗,c++,move-semantics,copy-assignment,move-assignment-operator,C++,Move Semantics,Copy Assignment,Move Assignment Operator,我有一门课是这样的: class Widget { public: Widget(A const& a) { /* do something */ } Widget(A&& a) { /* do something */ } }; A a{}; Widget widget{a}; 我可以这样使用: class Widget { public: Widget(A const& a) { /* do something */ } W

我有一门
是这样的:

class Widget
{
public:
    Widget(A const& a) { /* do something */ }
    Widget(A&& a) { /* do something */ }
};
A a{};
Widget widget{a};
我可以这样使用:

class Widget
{
public:
    Widget(A const& a) { /* do something */ }
    Widget(A&& a) { /* do something */ }
};
A a{};
Widget widget{a};
如果我得出结论,我不再需要
a
,我可以打电话:

Widget{std::move(a)};

但是现在,如果我只需要一个
对象来构建
小部件
,该怎么办?我会这样做吗:

Widget widget{A{}};


临时的是右值;不存在“临时左值”<代码>小部件{A{}
将调用
小部件(A&&A)
,因为
A{}
是临时的<代码>标准::移动在您有左值并且希望将其变成右值时使用,就像您使用:

A a{};
Widget widget{std::move(a)};
使用它的另一个原因是,如果您在一个接受右值的函数中,并且希望将其移动到构造函数中。带函数

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

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

临时的是右值;不存在“临时左值”<代码>小部件{A{}将调用
小部件(A&&A)
,因为
A{}
是临时的<代码>标准::移动在您有左值并且希望将其变成右值时使用,就像您使用:

A a{};
Widget widget{std::move(a)};
使用它的另一个原因是,如果您在一个接受右值的函数中,并且希望将其移动到构造函数中。带函数

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

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

我看不到任何“暂时左值”
A{}
是一个右值,因此它重载解析将获取移动构造函数A{}=A{}是一个有效的表达式吗?为什么不呢?你认为右值不能出现在等式的左边吗?因为
A{}=A{}
是有效的,这一定意味着
A{}
不是右值吗?在这种情况下,忘记赋值的左和右的值和LValk,这在C++中是不成立的。至于为什么<代码> {} = {};<代码>作品:我看不到任何“临时左值”
A{}
是一个右值,因此它重载解析将获取移动构造函数A{}=A{}是一个有效的表达式吗?为什么不呢?你认为右值不能出现在等式的左边吗?因为
A{}=A{}
是有效的,这一定意味着
A{}
不是右值吗?在这种情况下,忘记赋值的左和右的值和LValk,这在C++中是不成立的。至于为什么<代码> {} = {};<代码>作品请参见: