繁体   English   中英

为什么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 当你auto result ,它应该是another_var1的引用变量,它是对var1的引用,即它们都应该具有相同的地址 - 它们只是同一内存的名称别名。 看着Line 1 ,15号被归还,给人一种错觉,认为它们都是一样的。 然后, Line 2反驳了这一点。

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

任何人都可以解释真正发生的事情吗?

当你auto result ,它应该是another_var1的引用变量

这是你的错误。 如果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或更新的标准,则可以使用decltype跟踪返回类型的值类别( 左值引用 )以保留引用。

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

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

2 不再是真的 我应该知道最好不要先忽略Herb Sutter或Scott Meyers的检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM