使用引用返回类型函数作为右值

Posted

技术标签:

【中文标题】使用引用返回类型函数作为右值【英文标题】:Using reference return type function as a rvalue 【发布时间】:2022-01-16 05:37:12 【问题描述】:

在这种情况下string & funcstring 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";

所以tempb 都引用同一个字符串 - a

【讨论】:

【参考方案2】:

& 字符表示您传递的是引用,而不是对象。在这种情况下,该函数将a 作为引用,并返回对同一对象的另一个引用。最后,您仍然只有一个字符串实例。

如果你删除 & 字符,那么函数将返回你传入的字符串的副本。然后你将有 2 个字符串。

在您的特定示例中,它并没有太大变化,因为有 string b = func(a); 和符号,该函数返回对 a 的引用,但是使用此引用您正在名为 @ 的对象中创建一个新副本987654324@。如果删除 & 符号,该函数将返回 a 的副本,并且仍然在 b 中创建另一个副本。

【讨论】:

以上是关于使用引用返回类型函数作为右值的主要内容,如果未能解决你的问题,请参考以下文章

右值引用,移动语义,完美转发

返回引用

重新理解C11的右值引用

函數返回值是引用类型,此函数当左值右值

C++11 中的左值引用和右值引用的区别

函数返回值当引用