C++ 为什么自动y=reference_to_x的地址与x的地址不同?

C++ 为什么自动y=reference_to_x的地址与x的地址不同?,c++,pointers,reference,memory-address,C++,Pointers,Reference,Memory Address,假设您有以下代码: 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

假设您有以下代码:

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 
}
long&fn2(long&other_var1,long-other_var2){
另一个变量1=另一个变量1+另一个变量2;
另一个变量2=另一个变量2+另一个变量1;
返回另一个_var1;
}
int main(){
库特
当您
自动结果时
,它应该是另一个变量的参考变量

这是您的错误。如果
result
应该是一个引用,那么您必须声明一个引用。如下所示:

auto& result = fn2(var1, var2);
到底发生了什么
auto
从用于初始化它的变量类型1推断变量类型。我找不到任何人真正出来说它2,但我怀疑引用没有被推断出来,因为没有引用变量。引用不作为独立实体存在。例如,它们只是一个方便的新名称一个现有变量。一旦解析了所有引用

auto result = fn2(var1, var2);
还不如

fn2(var1, var2);
auto result = var1;
我怎样才能得到我所期望的? 将新变量声明为具有的引用

auto & result = fn2(var1, var2);
如果您是为C++14或更新的标准构建的,则可以使用跟踪返回类型的值类别an来保留引用

decltype(auto) result = fn2(var1, var2);
1.注意它是如何使用与模板相同的扣减规则的。为什么要重复自己


2.我应该知道最好不要先忽略赫伯·萨特或斯科特·迈尔斯的检查。

auto
默认为非引用,如果我没记错的话。
auto-result
是一个值,
auto&result
可能会起作用。@user4581301确实就是这个原因。这太愚蠢了。@user4581301相反的结果会出人意料,很危险erous@user4581301如果您觉得这不直观,那么我建议您更新关于引用的直觉您不必显式声明引用--
decltype(auto)
的行为更像OP期望的
auto
的行为,也会导致此处出现引用。@hvd请编辑此内容或做出新的答案以显示其魔力。@Giraffe船长我认为编辑此答案会更好,但我也认为我自己编辑此内容是不礼貌的。让我们拭目以待79303首先想到它。