代码之家  ›  专栏  ›  技术社区  ›  Some programmer dude

是否返回对复制初始化中未定义的本地对象行为的引用?

  •  5
  • Some programmer dude  · 技术社区  · 6 年前

    请考虑以下代码:

    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 延长了参考文献的使用寿命。

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

    2 回复  |  直到 6 年前
        1
  •  6
  •   Jarod42    6 年前

    生存期扩展仅适用于当绑定到常量引用或r值引用时的临时项。(临时不能绑定到非常量L值引用)

    即使你是临时返回,也会是ub:

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

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

    绑定到函数返回语句中返回值的临时值的生存期不会延长;临时值在返回语句的完整表达式结束时被销毁。

        2
  •  5
  •   Nicol Bolas    6 年前

    寿命延长仅适用于 temporaries (and subobjects thereof) my_local_foo 不是暂时的。