将引用传递给引用
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 &
。您在这里在哪里看到"对参考的引用"?
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?