通过引用查找调用范围的标准引用是什么

What is standard reference to lookup the scope of calls by reference?

本文关键字:引用 标准 范围 是什么 调用 查找      更新时间:2023-10-16

首先,这里有一段代码,让我不太确定引用标识符是如何工作的:

#include <iostream>    
using namespace std;    
void theUgly (int *z, int *q)
{
if(q == z)
*z=3;
/*else*/
*z=6;
};
void theNice (int &y, int *q)
{
theUgly(&y, q);
};
int main()
{
int x = 5;
theNice(x, &x);
cout << x << endl; 
}

我不确定输出是3还是5,因为我不确定是否使用具有2地址的2个标识符运行引用,这对我来说似乎很奇怪,或者只是将此处理留给用户。

但我实际上得到了6作为输出,现在让我假设在中编译了,这是某种原子操作。

我试图在我的c++11标准的"n3690"副本中找到关于这种行为的确切文档。我发现我能查找的大部分内容都是处理捕获引用声明或其他名为capture或lambda表达式的内容。但只有几次我能够在其中"通过引用"strg+f。在我看来,没有什么比解释描述我的代码片段行为的机制更好的了。

所以我的问题很简单:在c++11标准中,它到底在哪里被描述,程序必须如何处理参数和范围,就像我的测试片段一样?

编辑:在注意到并添加了缺少的else之后,该片段显示了我所期望的内容。但是,由于我在标准文档中找不到任何关于引用传递行为的信息,因此问题仍然存在,与代码片段无关。

您的*z=6;不在else子句中。此任务在任何情况下都会执行。

实际上,g++-5.3 -O2 -std=c++14theNice转换为:

void theNice (int &y, int *q)
{
y = 6;
};

关于引用作为函数自变量的行为:

  1. [dcl.fct]:函数参数声明
  2. [dcl.init.ref]:初始化引用
  3. [expr.call]:使用参数表达式初始化函数参数

简而言之:它们的行为类似于本地引用,并引用(别名)它们绑定到的(l)值。调用一个期望使用(l)的(lvalue)引用的函数会将该引用绑定到被调用者作用域中提供的值。