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

时间:2016-06-09 13:38:23

标签: c++ c++11 scope parameter-passing pass-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; 
}

我不确定输出为35,因为我不确定参考是否有2个带有2个地址的标识符,这对我来说似乎很奇怪,或者只是将这种处理留给用户。

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

我试图在我的&#34; n3690&#34;中找到有关此行为的确切文档。 c ++ 11标准的副本。我发现我能够查找的大部分内容是处理捕获引用声明或其他名为capture或lambda表达式的东西。但只有少数几次,我能够strg + f&#34;参考&#34;在里面。在我看来,没有什么能像解释描述我的片段行为的机制一样。

所以我的问题很简单:在c ++ 11标准中究竟是如何描述的,程序如何处理参数和范围,就像我的测试片段一样?

修改 在注意到并添加了丢失的else之后,该片段就会显示出我的期望。但由于我无法在标准文档中找到有关通过引用行为表现的任何信息,因此问题仍然存在,与片段无关。

1 个答案:

答案 0 :(得分:1)

您的*z=6;不在else条款中。无论如何都会执行此分配。

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

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

作为函数参数的引用行为:

  1. [dcl.fct] :函数参数声明
  2. [dcl.init.ref] :参考资料初始化
  3. [expr.call] :使用参数表达式初始化函数参数
  4. 简而言之:它们的行为类似于本地引用,并且引用(别名)它们绑定的(l)值。调用一个期望(lvalue)引用带有(l)值的函数将该引用绑定到被调用者范围内的提供值。