为什么auto y = reference_to_x的地址和x的地址不一样?

Why is the address of auto y = reference_to_x not the same as the address of 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 
}

在您到达 Line 2 之前,一切都按预期进行,其中 false 是 returned。当你 auto result 时,它应该是对 another_var1 的引用变量,这是对 var1 的引用,即它们应该都具有相同的地址 - 它们是只需为同一内存命名别名。查看 Line 1,15 被 return 编辑,给人一种他们都一样的错觉。然后,Line 2 反驳了这一点。

不过,我认为这可能是 auto 的问题。如果删除 auto 并将其替换为真正的 return 类型 long&,您将获得预期的结果。

谁能解释一下到底发生了什么?

When you auto result, it is supposed to be a reference variable to another_var1

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

auto& result = fn2(var1, var2);

到底发生了什么

auto从用于初始化它的变量类型推导出变量的类型1。我找不到任何人真正出来说它2,但我怀疑引用不是推导出来的,因为没有引用变量这样的东西。引用不作为独立实体存在。它们只是现有变量的一个方便的新名称 an alias。解决所有引用后

auto result = fn2(var1, var2);

还不如

fn2(var1, var2);
auto result = var1;

我怎样才能得到我想要的东西?

使用

将新变量声明为引用
auto & result = fn2(var1, var2);

如果您正在为 C++14 或更新的标准构建,decltype can be used to track the returned type's value category, an lvalue reference,以保留参考。

decltype(auto) result = fn2(var1, var2);

1Gory details。请注意它如何使用与模板相同的推导规则。为什么要重复自己?

2No longer true。我应该知道最好不要忽略先与 Herb Sutter 或 Scott Meyers 核实。