我认为在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() 有资格作为参考的参考??
答案 0 :(得分:5)
不,g()
没有参考参考。它需要引用int
。 f()
将对收到的int
的引用转发给g()
。
“对引用的引用”实际上并不存在,但有rvalue references,它们与引用类似,但允许绑定到临时对象。
答案 1 :(得分:5)
在f
的正文中,表达式 x
的值为int
。 变量 x
具有类型int &
这一事实意味着表达式的值是左值,因此它可以绑定到函数{{1}的参数}。
答案 2 :(得分:4)
1)传递对引用的引用没有任何问题(它是move-constructor和move-assignment运算符使用的 - 尽管它实际上称为rvalue-reference)。
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;
}
答案 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 &
。你在哪里看到“参考参考”?