【问题标题】:Is returning a reference to a local object undefined behavior in copy initialization?在复制初始化中是否返回对本地对象未定义行为的引用?
【发布时间】:2018-11-17 16:11:24
【问题描述】:

考虑以下代码:

struct foo
{
    foo(foo const&) = default;  // To make sure it exists
};

foo& get_local_foo_reference()
{
    foo my_local_foo;
    return my_local_foo;  // Return a reference to a local variable
}

int main()
{
    foo my_foo = get_local_foo_reference();
}

现在每个人都会同意返回对局部变量的引用是不好的,并且会导致未定义的行为。

但在copy initialization的情况下(如上面的代码所示),参数是一个常量左值引用,所以它应该是参数的reference initialization,这样可以延长引用的生命周期。

这是有效的,还是仍然是未定义的行为?

【问题讨论】:

  • "参数是一个常量左值引用" 不,不是。这是一个foo 类型的表达式,它是一个左值表达式。没有const& 参与。

标签: c++ reference return language-lawyer lifetime


【解决方案1】:

寿命延长仅适用于绑定到 const 引用或 r-value 引用的临时对象。 (临时不能绑定到非 const 左值引用)

即使你临时返回,也是UB:

const foo& create_foo() { return foo{}; } // Also UB

来自http://eel.is/c++draft/class.temporary#6.10

临时绑定到函数返回语句中的返回值的生命周期没有延长;临时在 return 语句中的完整表达式的末尾被销毁。

【讨论】:

    【解决方案2】:

    生命周期延长仅适用于temporaries (and subobjects thereof)my_local_foo 不是临时的。

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多