关于C++的引用与函数调用问题

#关于C++的引用与函数调用问题
之前已经定义了一个函数例如求两点之间的长度
distacne(point &a,point &b);
point是点类,函数形参为类的引用。
如果有point c,d可以直接distance(c,d)调用函数。
但是,定义一个返回值为point的函数c(),d()进行如下操作
distance(c(),d()),程序会出错
若返回值为point &则会成功,这是为什么??

变量名其实就是一个静态的指针,而函数的返回值是一个值,&运算符是用来访问地址的,所以不行。返回值为point &的话表示获取了结果的地址,所以是可以的。

distance(c(),d());
在这行代码中,虽然c(),d()的返回值是point类型的,但由于没有变量对其结果进行接收,所以c(),d()返回的是两个point的临时对象。临时对象会在改行程序运行完后自动析构,而distance函数传递的是这两个对象的引用,因此在进入distance函数体后,由于临时对象已经析构不存在了,引用指向的位置就是不可访问的内存,也即引用失效,就会报错。

这里面核心来讲其实是一个左值和右值的概念,左值可以粗浅的理解为可以放在等号左边的变量,
即具名变量,而右值可以理解为只能出现在等号右边的类型,即临时对象,函数参数为普通引用的情况下要求的是左值才行,
但是凡事也有例外,C++提供了一种相对方便的语法糖来实现右值传递给左值引用的情况,在你的这个例子中,
如果声明改为void distance(const point& a, const point& b),那么distance(c(),d())应该是可以正常运行的,
这里面的核心是它将c(),d()返回的point临时对象赋给了一个隐形的左值,然后生成一个左值引用来引用这个隐形的左值。

当然,还有第二种方式,就是所谓的移动语义,实现以下重载也可以让distance(c(),d())正常运行:
void distance(point&& a, point&& b)