我认为在 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() 的形式参数不符合对引用的引用吗?
我认为在 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() 的形式参数不符合对引用的引用吗?
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。
不,g()没有参考参考。它需要引用一个int. 将收到f()的引用转发给.intg()
“对引用的引用”实际上并不存在,但有右值引用,它们类似于引用,但允许绑定到临时对象。
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
在您的代码中,您没有尝试将引用传递给引用。内部f表达式x产生一个类型的左值int。它不是参考。C++ 中的表达式永远不会产生引用类型的可访问结果,因为引用类型的任何结果都会立即被语言解释为非引用类型的左值。
见 5/5
如果表达式最初具有类型“对 T 的引用”(8.3.2、8.5.3),则在任何进一步分析之前将类型调整为 T。表达式指定引用表示的对象或函数,表达式是左值或 x 值,具体取决于表达式。
PS我不确定您所说的“g() 的形式参数是否符合对引用的引用”是什么意思。的形参g声明为int &。您在哪里看到“参考参考”?