左值转换的左值?

时间:2017-06-21 13:39:58

标签: c++ c++11 type-conversion rvalue-reference lvalue

为什么不能将rvalues转换为左值?但是可以在相反方向进行转换。从技术上讲,rvalues确实有一个内存地址,不是吗?

2 个答案:

答案 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() 的常见用途是调用函数/方法,当我不需要这些值时,它们通过引用返回值。