传递对引用的引用

时间:2013-08-27 19:04:24

标签: c++ pass-by-reference

我认为在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() 有资格作为参考的参考??

5 个答案:

答案 0 :(得分:5)

不,g()没有参考参考。它需要引用intf()将对收到的int的引用转发给g()

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

答案 1 :(得分:5)

f的正文中,表达式 x的值为int变量 x具有类型int &这一事实意味着表达式的值是左值,因此它可以绑定到函数{{1}的参数}。

答案 2 :(得分:4)

1)传递对引用的引用没有任何问题(它是move-constructor和move-assignment运算符使用的 - 尽管它实际上称为rvalue-reference)。

2)你正在做的是没有传递对引用的引用,而是通过fg传递相同的引用:

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;
}

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

见5/5

  

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

P.S。我不确定你的意思是“g()的形式参数是否有资格作为对引用的引用”。 g的形式参数声明为int &。你在哪里看到“参考参考”?