【问题标题】:Is it undefined to return reference to a function-scoped variable as a value?将函数范围变量的引用作为值返回是否未定义?
【发布时间】:2019-01-06 12:21:03
【问题描述】:

下面的代码合法吗?

int foo()
{
    int local = 5;
    int& local_ref = local;
    return local_ref;
}

如果是,那么很可能会将local 的值复制到返回值之前 破坏local,但为什么呢? GCC 和 MSVC 都没有抱怨这一点,所以它可能是合法的......不是吗?

【问题讨论】:

  • 它是正确的。值被复制。另一方面,返回本地引用会调用未定义的行为。通过本地引用,我的意思是 int& foo(),而不是变量 local_ref
  • 您的函数返回int,而不是int&,因此您没有返回引用。因此,您需要重新表述您的问题,例如返回函数范围变量的副本是否未定义,然后您会立即发现这不是一个真正的问题。

标签: c++ reference pass-by-value


【解决方案1】:

有效。该值在locallocal_ref 超出范围之前被复制。另一方面,返回本地引用会调用未定义的行为。通过本地引用,我的意思是int& foo(),而不是变量local_ref


在调用函数之前,会创建堆栈帧(堆栈空间用于参数、返回值以及作为其中一部分的当前程序计数器被保存)。然后在函数执行期间,在堆栈上构造局部变量(locallocal_ref)。在程序计数器离开函数范围之前,返回值(value)被复制到函数堆栈帧中,在此之后,程序计数器返回到堆栈帧中存储的位置(从哪里@987654328 @ 被调用)。

有关更多信息,请搜索堆栈帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多