我仍然没有弄清楚&
在编译器中如何工作。
要弄清楚,我尝试分解下面的代码:
private:
int data;
public:
int& at()
{
return data;
}
int at()
{
return data;
}
const int& result = mymay.at(); //call the two functions
我发现int& at()
返回一个地址,int at()
返回一个值;编译器首先将值写入内存,然后将“结果”的地址设置为该地址。
因此,我知道int at()
将返回一个副本。
我也了解写friend ostream& operator<<(ostream &os , const A &obj)
但是我不知道这是否正确:在下面的代码中,A &get1()
返回一个l-value
,而A get2()
返回一个r-value
。
#include <iostream>
using namespace std;
class A
{
public:
A &get1(){
return *this;
}
A get2(){
return *this;
}
friend ostream& operator<<(ostream &os , A &obj){
cout<<"An l-value function called."<<endl;
return os;
}
friend ostream& operator<<(ostream &os , A &&obj){
cout<<"An r-value function called."<<endl;
return os;
}
};
int main()
{
A tmp;
cout<<"get1: "<<tmp.get1()<<"get2: "<<tmp.get2()<<endl;
return 0;
}
实际结果:
An l-value function called.
An r-value function called.
答案 0 :(得分:6)
返回引用的at
版本允许您通过该引用修改成员数据data
:
mymay.at() = 1;
在data
的实例中将mymay
设置为1。因此mymay.at()
是 l值:即可以放在左手作业的另一面。
返回值的at
版本不允许您这样做。这不是 l值。
第二点, l值不能绑定到 rvalue引用 &&
,而匿名临时可以。 cout
的重载分辨率是明确的,它说明了程序的输出。