![](/img/trans.png)
[英]What happen when a lvalue assigned to a rvalue reference? No destruction of the temporary object?
[英]Why is a reference type an lvalue when accessed with a temporary object?
为什么将值分配给使用临时 object 访问的引用变量有效,但不适用于非引用类型?
class a
{
public:
int m;
int &n;
a():m(2),n(m)
{
cout<< "A's constructor"<<endl;
}
};
int main()
{
// a().m = 6; // this gives an error that a temporary object is being used
// as an lvalue
a().n = 20; // But this line works
return 0;
}
但是a().n
真的是暂时的吗? 考虑这段代码:
class a
{
public:
int m;
int &n;
a():m(2),n(m)
{
cout<< "A's constructor"<<endl;
}
a(int& _n):m(2),n(_n)
{
cout<< "A's constructor"<<endl;
}
};
int main()
{
a().n = 20; // (1)
int n = 0;
a(n).n // (2)
return 0;
}
第(2)
行清楚地表明.n
不是临时的。 它一定不是,因为它是对局部n
变量的引用。
但是,编译器无法知道n
将引用什么。 甚至可以做n(rand_bool()? m: _n)
并且它必须工作。
相反,编译使用类型系统来知道应该分配什么。
例如,文字9
是int
类型的 pr 值。 你不能分配给它:
9 = 8; // nope
在您的代码中, a()
是纯右值或类型a
。 它的所有价值成员也都是。 这就是a().m
不起作用的原因。 m
是纯右值。
但是, a().n
是一个左值,因为n
是一个左值引用。 不管它指向哪个变量。
a().n = 20;
因为n
是左值引用类型,所以有效。 编译器不知道n
在实现中是对m
的引用。 它假定n
是一个有效的左值引用,因此接受该行。
理论上,当您分配给a().n
时,您可以分配给一个独立于a()
生命周期的变量。 编译器无法评估这一点,如果它不接受该行,它将妨碍程序员。 想象一下下面的用例:
// Global variable.
int gv;
class a
{
public:
int m;
int &n;
a():m(2), n(gv) // n is a reference to the global variable.
{
cout<< "A's constructor"<<endl;
}
};
int main()
{
a().n = 20; // Changes gv. It is a valid operation.
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.