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)
现在每个人都同意返回对局部变量的引用是不好的,并导致未定义的行为.
但是在复制初始化的情况下(如上面的代码所示),参数是一个常量左值引用,因此它应该是参数的引用初始化,这会延长引用的生命周期.
这是有效的,还是仍然是未定义的行为?
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结束时被销毁.
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |