使用引用返回类型函数作为右值
Posted
技术标签:
【中文标题】使用引用返回类型函数作为右值【英文标题】:Using reference return type function as a rvalue 【发布时间】:2022-01-16 05:37:12 【问题描述】:在这种情况下string & func
和string func
之间有什么区别(即,如果我删除 & 符号会发生什么变化)?
string & func(string& a)
return a;
int main()
string a = "42";
string b = func(a);
return 0;
【问题讨论】:
现在问题中显示的具体情况?根本没有实际区别。 是的,我知道当我们将该函数用作左值但试图理解这种情况时会发生什么 【参考方案1】:问题中的程序没有说明两者之间的区别。但是,这里有一些区别:
string& func(string& a)
上面的函数返回一个对字符串的引用。这意味着您将能够从func
的返回值更改原始字符串(在本例中为a
)。例如:
func(a) = "some other string"
将修改a
并将其值设置为“其他字符串”。但是,以下内容不会这样做:
string b = func(a);
b = "some other string";
因为这里b
只接收字符串的副本。如果之前的块被修改如下:
string& b = func(a);
b = "some other string";
然后它还会将a
的值设置为“其他字符串”,因为这里b
本身就是对a
的引用。其实相当于写:
string a = "42";
string& temp = a;
string& b = temp;
b = "some other string";
所以temp
和b
都引用同一个字符串 - a
。
【讨论】:
【参考方案2】:& 字符表示您传递的是引用,而不是对象。在这种情况下,该函数将a
作为引用,并返回对同一对象的另一个引用。最后,您仍然只有一个字符串实例。
如果你删除 & 字符,那么函数将返回你传入的字符串的副本。然后你将有 2 个字符串。
在您的特定示例中,它并没有太大变化,因为有 string b = func(a);
和符号,该函数返回对 a
的引用,但是使用此引用您正在名为 @ 的对象中创建一个新副本987654324@。如果删除 & 符号,该函数将返回 a
的副本,并且仍然在 b
中创建另一个副本。
【讨论】:
以上是关于使用引用返回类型函数作为右值的主要内容,如果未能解决你的问题,请参考以下文章