我知道经验法则是,如果返回的变量存在于调用者中,则通过引用返回。假设我们有一个函数:
int& f(int& a){ return a; }
现在,在调用者中,我可以用两种方式调用:
int a = 5;
int b1 = f(a); // 1
int& b2 = f(a); // 2
区别在于调用者b1或a的变化不会相互影响,但调用者b2或a的变化会相互影响。
这意味着,a在调用对象中指向int的值被复制到b2,然而,由于上面的语句,似乎只有a在调用对象中指向的值被复制到b1。
那么像第一种情况一样通过引用返回的优点是什么呢?像1这样的语句的例子是复制赋值操作符,它通过引用返回赋值链:例如:obj1 = obj2 = obj3;
我错过了什么吗?
坦率地说,你的论点没有实际意义。
根据同样的推理,你可能会认为一般使用引用没有任何好处,因为它可以用来复制:
int x = 42;
int& ref = x;
int y = ref; // makes a copy
然而,仅仅因为你可以使用引用来制作副本并不会降低引用的可用性:
ref = 24; // does modify x
在你的例子中:
int a = 5; int b1 = f(a); // 1 int& b2 = f(a); // 2
调用者决定在// 1
中复制几乎与f
无关。当然,你可以使用参考来制作副本。但是你不能使用副本来修改a
:
f(a) = 42; // modifies a
当f
返回一个引用时,这只按预期工作(修改a
)。