首先,这里有一些代码片段让我觉得不太清楚引用标识符的工作原理:
#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
作为输出,现在让我假设在中编译某种原子操作。
我试图在我的&#34; n3690&#34;中找到有关此行为的确切文档。 c ++ 11标准的副本。我发现我能够查找的大部分内容是处理捕获引用声明或其他名为capture
或lambda表达式的东西。但只有少数几次,我能够strg
+ f
&#34;参考&#34;在里面。在我看来,没有什么能像解释描述我的片段行为的机制一样。
所以我的问题很简单:在c ++ 11标准中究竟是如何描述的,程序如何处理参数和范围,就像我的测试片段一样?
修改
在注意到并添加了丢失的else
之后,该片段就会显示出我的期望。但由于我无法在标准文档中找到有关通过引用行为表现的任何信息,因此问题仍然存在,与片段无关。
答案 0 :(得分:1)
您的*z=6;
不在else
条款中。无论如何都会执行此分配。
实际上,g++-5.3 -O2 -std=c++14
会将theNice
转换为:
void theNice (int &y, int *q)
{
y = 6;
};
作为函数参数的引用行为:
[dcl.fct]
:函数参数声明[dcl.init.ref]
:参考资料初始化[expr.call]
:使用参数表达式初始化函数参数简而言之:它们的行为类似于本地引用,并且引用(别名)它们绑定的(l)值。调用一个期望(lvalue)引用带有(l)值的函数将该引用绑定到被调用者范围内的提供值。