【发布时间】:2018-04-25 12:34:09
【问题描述】:
我想澄清一下这个特殊情况:
class Test
{
Test& operator=(const Test& copy)
{
...
}
Test() = default;
}
Test a;
Test b;
b = a; //Is "a" converted to an rvalue?
"a" 是一个左值,但它现在是赋值的右手操作数。这是否意味着它被转换为右值?
此代码无法编译:
class Test
{
Test& operator=(Test&& copy)
{
...
}
Test() = default;
}
Test a;
Test b;
a = b; //Error
但是这个可以:
class Test
{
Test& operator=(Test& copy)
{
...
}
Test() = default;
}
Test a;
Test b;
a = b; //OK
由于左值引用不能绑定到右值,这是否意味着这里没有发生转换?如果是这种情况,什么时候会发生隐式左值到右值的转换? (除了基本类型的 operator+ 的情况)
【问题讨论】:
-
Test b = a;不是赋值,而是初始化。它不使用operator=,而是使用构造函数。不,您的示例中没有左值到右值的转换。 -
只要在需要右值的上下文中使用左值,就会发生隐式左值到右值的转换。复制构造函数不能是这样的上下文 - 对于类类型,左值到右值的转换意味着复制,所以如果复制构造函数需要这样的转换,你将有一个无限递归。
-
@IgorTandetnik 对不起,你是对的,我已经更正了这个问题。这种情况适用于赋值和初始化。
-
你可以look at the AST看看编译器是如何解释这个的。它显示了直接进入构造函数的左值。
-
void f(Test t) {} Test a; f(a);此处的函数调用需要左值到右值的转换,因为该函数按值获取其参数。
标签: c++ lvalue-to-rvalue