10

我认为在 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() 的形式参数不符合对引用的引用吗?

4

5 回答 5

5

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

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;
}
于 2013-08-27T19:09:48.480 回答
5

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

于 2013-08-27T19:07:39.183 回答
5

不,g()没有参考参考。它需要引用一个int. 将收到f()的引用转发给.intg()

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

于 2013-08-27T19:05:59.647 回答
1

A reference is an alias to a different object. Once the reference has been initialized, it behaves exactly as if you were accessing the object directly, so you are not passing a reference to a reference, but rather a reference to the real object (to which you refer by another reference).

Creating a reference to a reference would be something like:

typedef int& intr;
void f(intr& x);    // reference to a reference type
于 2013-08-27T19:15:21.787 回答
0

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

见 5/5

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

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

于 2013-08-27T19:11:34.340 回答