为何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
相关产品推荐
相关产品推荐

