通过引用查找调用范围的标准引用是什么
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
作为输出,现在让我假设在中编译了,这是某种原子操作。
我试图在我的c++11标准的"n3690"副本中找到关于这种行为的确切文档。我发现我能查找的大部分内容都是处理捕获引用声明或其他名为capture
或lambda表达式的内容。但只有几次我能够在其中"通过引用"strg
+f
。在我看来,没有什么比解释描述我的代码片段行为的机制更好的了。
所以我的问题很简单:在c++11标准中,它到底在哪里被描述,程序必须如何处理参数和范围,就像我的测试片段一样?
编辑:在注意到并添加了缺少的else
之后,该片段显示了我所期望的内容。但是,由于我在标准文档中找不到任何关于引用传递行为的信息,因此问题仍然存在,与代码片段无关。
您的*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)值。调用一个期望使用(l)的(lvalue)引用的函数会将该引用绑定到被调用者作用域中提供的值。
相关文章:
- 标准库类型的赋值运算符的引用限定符
- 没有取消引用/解包对象的标准方法?
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 为什么标准不允许通过引用捕获不完整的异常类型?
- 标准库容器结构是否存储副本或引用?
- 是否可以将引用存储在标准::任何中
- 在标准算法中,通过引用捕获更正确
- 如何正确访问通过引用从标准输入传递给构造函数的参数的值
- 使用 C++17 标准对"WinMain@16"的未定义引用
- 使用标准::绑定在可变参数模板中完美转发引用
- 为什么我不能在标准::未来参数中使用引用
- 通过引用查找调用范围的标准引用是什么
- 类型说明符中允许的类型定义的C++11标准引用使用
- 将r值绑定到l值引用是非标准的Microsoft C++扩展
- C++11:常量和引用类型上“auto”操作的标准引用
- 取消引用等于 nullptr 的指针是否是标准的未定义行为?
- 带有标准容器和常量引用的c++代码显示出意外的内存
- SWIG 不可变标准::映射引用
- 删除左值,保留左值引用(标准类型特征可用?)
- 空引用-C++标准中的Where