为什么不能将rvalues转换为左值?但是可以在相反方向进行转换。从技术上讲,rvalues确实有一个内存地址,不是吗?
答案 0 :(得分:3)
您可以:
int&& x = 3;
x
现在是一个左值。所谓的“右值引用”可以绑定到临时,
但是任何名称为的都是左值,因此如果需要返回右值,则需要forward<>()
。
请注意,通过将临时绑定到右值引用(或const引用),可以延长其寿命。从技术上讲可以 但不建议使用,因为临时雇员的寿命很短,所以您 通常会得到悬挂的参考。
答案 1 :(得分:3)
编写模板函数 unmove()
相当简单,它的作用与 std::move()
相反:
template<class T> T& unmove(T&& t) { return t; }
请注意,根据 C++11 以来的标准:
在包含该函数调用的完整表达式结束之前,函数调用中的引用参数的临时绑定一直存在:如果函数返回一个引用,该引用比完整表达式的生命周期长,则它成为悬空引用。
因此在单个完整表达式中使用 unmove()
是安全的,但是在表达式被完整计算之后,临时变量就会消失。
我对 unmove()
的常见用途是调用函数/方法,当我不需要这些值时,它们通过引用返回值。