【问题标题】:Why is the address of auto y = reference_to_x not the same as the address of x?为什么auto y = reference_to_x的地址和x的地址不一样?
【发布时间】:2018-05-07 22:28:48
【问题描述】:

假设你有以下代码:

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。当你autoresult 时,它应该是another_var1 的引用变量,这是对var1 的引用,即它们都应该具有相同的地址——它们只是相同内存的名称别名。查看Line 1,返回15,给人一种它们都一样的错觉。然后,Line 2 反驳了这一点。

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

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

【问题讨论】:

  • auto 如果我没记错的话默认为非引用。
  • auto result 是一个值,auto&amp; result 可以解决问题。
  • @user4581301 确实这就是原因。太傻了。
  • @user4581301 相反会是出乎意料和危险的。
  • @user4581301 如果您觉得这不直观,那么我建议您更新您对参考文献的直觉

标签: c++ pointers reference memory-address


【解决方案1】:

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

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

auto& result = fn2(var1, var2);

【讨论】:

  • 您不一定需要明确声明引用——decltype(auto) 的行为更像 OP 期望 auto 的行为方式,并且也会在此处产生引用。
  • @hvd 请编辑此内容或制作新答案以展示这种魔力。
  • @CaptainGiraffe 我认为编辑这个答案会更好,但我也认为我自己编辑它是不礼貌的。让我们先看看user2079303是怎么想的。
【解决方案2】:

真正发生了什么

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);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多