You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何auto变量result与原变量var1地址不一致?附C++代码示例

关于auto推导导致变量地址不同的问题解答

嘿,这其实是C++里auto类型推导的经典坑点,咱们把两个问题合并起来说,本质是同一个逻辑~

核心原因:auto会丢弃引用属性

当你用auto声明变量时,编译器的推导规则会自动忽略初始化表达式的引用修饰符,除非你显式指定要保留引用。

对应第一个问题

如果reference_to_x是x的引用(比如int& reference_to_x = x;),那么auto y = reference_to_x;里,auto会推导出int(而不是int&),所以y是一个全新的变量,它的值是x的拷贝,自然和x的内存地址不一样。

对应第二个代码例子

咱们看你的代码:

long& fn2(long& another_var1, long another_var2){
    another_var1 = another_var1 + another_var2;
    another_var2 = another_var2 + another_var1;
    return another_var1;
}
int main (){
    cout << boolalpha;
    long var1 = 5;
    long var2 = 10;
    auto result = fn2(var1, var2); // 重点在这一行
    cout << &result << endl;
    cout << &var1 << endl;
    cout << result << endl; //Line 1
    cout << (&result == &var1) << endl; //Line 2
}

fn2返回的是long&,也就是对var1的引用。但auto result = ...这行里,auto推导时会把返回值的引用属性丢掉,最终result的实际类型是long——它是一个独立的栈变量,值是从var1拷贝过来的,所以它的地址和var1完全不同。

这也是为什么Line2会输出false,而Line1会输出15(因为var1在fn2里被改成了5+10=15,result拷贝了这个值)。

怎么让地址相同?显式声明引用

如果你希望result是var1的别名(也就是引用),需要把声明改成:

auto& result = fn2(var1, var2);

这时候auto会推导出long,加上&之后,result的类型就是long&,和fn2的返回类型一致,它直接绑定到var1上,地址自然和var1完全相同,Line2就会输出true了。

内容的提问来源于stack exchange,提问作者Art

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:16