将引用传递给引用

Pass a reference to a reference

本文关键字:引用      更新时间:2023-10-16

我认为在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()没有引用引用。它需要对int的引用。 f()将接收到int引用转发给g()

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

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

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

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

创建对引用的引用如下所示:

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

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

查看 5/5

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

附言我不确定你所说的"g(( 的形式参数不符合对引用的引用"是什么意思。g 的形式参数声明为 int & 。您在这里在哪里看到"对参考的引用"?