![](/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.