【问题标题】: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;
}

【问题讨论】:

  • 现在问题中显示的具体情况?根本没有实际区别。
  • 是的,我知道当我们将该函数用作左值但试图理解这种情况时会发生什么

标签: c++ reference


【解决方案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 中创建另一个副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多