通过引用传递的值的引用

Reference of value passed by reference

本文关键字:引用      更新时间:2023-10-16

我不知何故开始尝试理解C++并与"未定义","未指定"混淆。

参考文献被广泛记录,但我没有找到我的"特定"问题的答案。

通过引用传递的值的引用呢?

我已经使用以下代码对此进行了测试:

#include <iostream>
int func(int& a)
{
    int b=a;
    ++b;
    std::cout << "[func] b: " << b << std::endl;
    return b;
}
int func2(int& a)
{
    int& b=a;
    ++b;
    std::cout << "[func2] b: " << b << std::endl;
    return b;
}
int main()
{
    int a=1;
    std::cout << "a: " << a << std::endl;
    func(a);
    std::cout << "a after func: " << a << std::endl;
    func2(a);
    std::cout << "a after func2: " << a << std::endl;
    return 0;
}

并得到输出:

a: 1
[func] b: 2
a after func: 1
[func2] b: 2
a after func2: 2

它似乎做了我所期望的,但这是标准规定的行为吗?

从最新的公共标准草案中,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf:

8.5.3 参考文献 [dcl.init.ref] 1 声明为 T&或 T&&&的变量,即"对类型 T 的引用"(8.3.2),应由 T 类型的对象或函数或可以 转换为 T. [ 示例:

int g(int);  
void f() {   
    int i;   
    int& r = i; // r refers to i  
    r = 1; // the value of i becomes 1 
    int* p = &r; //p points to i 
    int& rr = r; // rr refers to what r refers to, that is, to i
[...]

因此,虽然这句话可能会让人不确定(这里相关的部分可能是引用"可以转换为 T"),但示例(最后一行在这里相关)是明确的。

是的,这是标准行为。

当你通过引用传递某些东西时 - 你实际上只是为变量分配了一个额外的名称。

喜欢-

当你从main使用func(a)调用func2(int&a)时,你正在为main中定义的变量"a"分配一个新名称。主变量 'a' 在 func2 中以名称 'a' 而闻名。基本上 fun2::a 和 main::a 指的是相同的变量。

另外,当你这样做时int & b=a;在 func2 中,您将为 func2::a ->func2::b 创建一个新名称。因此,变量保持不变,只添加了新名称。

您可以从以下链接
中找到很好的答案http://www.stroustrup.com/bs_faq2.html#undefined
未定义、未指定和实现定义的行为