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

时间:2018-05-07 22:28:48

标签: 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 = 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。当您auto result时,它应该是another_var1的引用变量,它是对var1的引用,即它们都应具有相同的地址 - 它们是只为同一内存命名别名。看着Line 1,就会返回15,给人一种错觉,认为它们都是一样的。然后,Line 2反驳了这一点。

但是,我认为这可能是auto的问题。如果您删除auto并将其替换为真实的返回类型long&,则会获得预期的结果。

任何人都可以解释实际发生的事情吗?

2 个答案:

答案 0 :(得分:5)

  

当你auto result时,它应该是another_var1

的参考变量

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

auto& result = fn2(var1, var2);

答案 1 :(得分:1)

究竟发生了什么

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

auto result = fn2(var1, var2);

也可能是

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

我如何得到我的预期?

使用

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

如果您正在构建C ++ 14或更新的标准,decltype可用于跟踪返回类型的值类别lvalue reference,以保留引用。

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

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

2 No longer true。我应该知道最好不要先忽略Herb Sutter或Scott Meyers的检查。