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

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

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

#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 作为输出,现在让我假设有 编译成 某种原子操作。

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

所以我的问题很简单:在 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)值的(左值)引用,将该引用绑定到被调用者范围内提供的值。