gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:38:23 25 4
gpt4 key购买 nike

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

#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]:用参数表达式初始化函数参数

简而言之:它们的行为类似于本地引用和引用(别名)它们绑定(bind)到的 (l) 值。调用一个函数,该函数需要一个带有 (l) 值的(左值)引用,将该引用绑定(bind)到被调用者范围内提供的值。

关于c++ - 什么是通过引用查找调用范围的标准引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com