【问题标题】:Pass a reference to a reference将引用传递给引用
【发布时间】:2013-08-27 19:04:23
【问题描述】:

我认为在 C++ 中传递对引用的引用是非法的。但是,当我运行此代码时,它没有给我任何错误。

void g(int& y)
{
   std::cout << y;
   y++;
 }

 void f(int& x)
{
  g(x);
}
int  main()
{
  int a = 34;
  f(a);
  return 0;

 }

形参不是 G() 有资格作为对参考的参考??

【问题讨论】:

  • 呃...在您的代码中,g 被声明为void g(int&amp; y)。您在其形式参数列表中的何处看到“对引用的引用”?
  • 我将 g 中的 y 解释为 int& int & x

标签: c++ pass-by-reference


【解决方案1】:

1) 将引用传递给引用并没有错(这是移动构造函数和移动赋值运算符使用的 - 尽管它实际上称为右值引用)。

2)您所做的不是将引用传递给引用,而是将相同的引用通过f 传递给g

void g(int& x)
{
    x = 5;
}

void f(int& x)
{
    std::cout << "f-in " << x << std::endl;
    g(x);
    std::cout << "f-out " << x << std::endl;
}

int main()
{
    int x = 42;
    f(x);
    std::cout << "New x = " << x << std::endl;
}

【讨论】:

  • 移动构造函数和移动赋值不使用引用到引用。他们参数的语法是T&amp;&amp;,但这是定义作为右值引用。对引用的引用一直是并且将继续是非法的。
  • @PeteBecker:如果你遵循他的逻辑,他会假设 int&amp;&amp; 是对引用的引用(并且还假设链接两个都以 int&amp; 作为参数的函数是这样的)。因此,我对#1 进行了澄清,然后对#2 进行了进一步解释。
  • @PeteBecker:阅读理解 101 - 这正是我所说的。
  • “开汽车没有错,但这叫开车”。
  • @PeteBecker:“虽然它实际上被称为右值引用” - 我不确定你在那里可以更精确和准确。
【解决方案2】:

不,g() 没有引用引用。它引用了intf() 将收到的对int 的引用转发到g()

“对引用的引用”实际上并不存在,但有rvalue references,类似于引用,但允许绑定到临时对象。

【讨论】:

    【解决方案3】:

    f 的主体中,表达式 x 的值是int变量 x 具有int &amp; 类型这一事实意味着表达式的值是一个左值,因此它可以绑定到函数g 的参数。

    【讨论】:

      【解决方案4】:

      引用是对不同对象的别名。初始化引用后,它的行为就像您直接访问对象一样,因此您传递的不是对引用的引用,而是对真实对象的引用(您通过另一个引用引用该对象)。

      创建对引用的引用类似于:

      typedef int& intr;
      void f(intr& x);    // reference to a reference type
      

      【讨论】:

        【解决方案5】:

        在您的代码中,您没有尝试将引用传递给引用。在f 内部,表达式x 产生一个int 类型的左值。它不是参考。 C++ 中的表达式永远不会产生引用类型的可访问结果,因为引用类型的任何结果都会立即被语言解释为非引用类型的左值。

        见 5/5

        如果一个表达式最初的类型是“对 T 的引用”(8.3.2, 8.5.3),在任何进一步分析之前将类型调整为 T。表达式指定引用表示的对象或函数, 并且表达式是左值或 xvalue,具体取决于 表达。

        附:我不确定您所说的“g() 的形式参数是否符合对引用的引用”是什么意思。 g 的形参声明为int &amp;。您在哪里看到“对引用的引用”?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-03
          • 2014-08-21
          • 1970-01-01
          • 2022-08-22
          • 1970-01-01
          • 2013-09-15
          • 1970-01-01
          • 2017-05-07
          相关资源
          最近更新 更多