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

Som*_*ude 5 c++ return reference lifetime language-lawyer

请考虑以下代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

但是在复制初始化的情况下(如上面的代码所示),参数是一个常量左值引用,因此它应该是参数的引用初始化,这会延长引用的生命周期.

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

Jar*_*d42 6

Lifetime扩展仅适用于绑定到const引用或r值引用的临时值.(临时不能绑定到非const l-value引用)

即使你回归临时,也会是UB:

const foo& create_foo() { return foo{}; } // Also UB
Run Code Online (Sandbox Code Playgroud)

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

函数返回语句中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.


Nic*_*las 5

终身扩展仅适用于临时(及其子对象).my_local_foo不是暂时的.