在 Stack Overflow 的回答中here https://stackoverflow.com/a/9964002/1128289,Kerrek 发布了以下代码。
Foo && g()
{
Foo y;
// return y; // error: cannot bind ‘Foo’ lvalue to ‘Foo&&’
return std::move(y); // OK type-wise (but undefined behaviour, thanks @GMNG)
}
GManNickG 指出这会导致未定义的行为。
克雷克补充道
真的;除了前进和移动之外,您实际上并没有从任何地方返回&&。
这是一个人为的例子。
让我困惑的是,C++11 标准使用返回右值引用的函数调用作为 xvalue 表达式的示例。
xvalue(“eXpiring”值)也指一个对象,通常靠近
其生命周期结束(以便其资源可以被移动,例如
例子)。 xvalue 是某些类型表达式的结果
涉及右值引用 (8.3.2)。 [ 示例:调用结果
返回类型为右值引用的函数是 xvalue。 -结尾
例子 ]
那么,返回右值引用到底什么时候会导致未定义的行为呢?它是否总是导致未定义的行为,除了std::move
and std::forward
标准只是简单吗?或者您是否必须访问返回值才能产生未定义的行为?
*“何时”是指“在什么情况下”。我意识到这里没有有意义的时间概念。
转换为引用不会延长局部变量的生命周期。
因此,在本地过期后使用对本地的引用是未定义的行为。
由于函数完成时本地过期,因此无法使用返回值。
std::move
or std::forward
接受一个引用,并返回一个可能不同类型的引用。既不延长争论的生命周期,也不返回对自己身体局部变量的引用。
这里的 UB 不返回右值引用,而是基于对象生命周期。它发生在使用时,而不是在施放或返回时。
也就是说,返回右值引用几乎从来都不是一个好主意:而是返回一个副本。副本可以参与寿命延长。例外是当你写类似的东西时forward_as_tuple
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)