为什么通过引用 return 是有利的?
Why is it advantageous to return by reference?
我知道经验法则是我们 return 通过引用当且仅当 returned 变量存在于调用者中。
假设我们有一个函数:
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。
那么 return 像第一种情况一样通过引用进行复制的优点是什么?
看到像 1 这样的语句的示例是复制赋值运算符,它通过引用 returns 来链接赋值:
例如: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
returns 引用时按预期(修改 a
)工作。
打个比方,你可以问:坐飞机有什么好处?飞机可以像汽车一样在地面上行驶;)
我知道经验法则是我们 return 通过引用当且仅当 returned 变量存在于调用者中。 假设我们有一个函数:
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。
那么 return 像第一种情况一样通过引用进行复制的优点是什么? 看到像 1 这样的语句的示例是复制赋值运算符,它通过引用 returns 来链接赋值: 例如: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
returns 引用时按预期(修改 a
)工作。
打个比方,你可以问:坐飞机有什么好处?飞机可以像汽车一样在地面上行驶;)