如何获得对右值的引用?
从概念上讲,rvalue 表达式创建一个临时对象,或者有时表示一个现有对象。可以像任何其他对象一样绑定到引用;但是,为了避免混淆,该语言只允许 rvalue 和 const lvalue 引用。
我在 C++ 中使用过 std::move 和 std::forward。我的问题是编译器实际上是如何实现的?
move 只返回一个 rvalue 对其参数的引用,相当于
static_cast<typename remove_reference<T>::type&&>(t)
函数调用的结果是一个rvalue(具体来说,一个xvalue),所以它可以绑定到一个rvalue引用,其中函数参数不能。这允许您从 左值 显式移动,使用 move 将其转换为 右值,同时不允许您意外地从它移动。
forward 类似,但重载以返回对 rvalue 或 rvalue 引用的 rvalue 引用和 lvalue 引用其他任何东西。
如果一个左值是你可以得到的地址
这或多或少是正确的。官方的定义是“指定一个函数或一个对象”的表达,那些是有地址的东西。
并且右值完全不是左值
不是真的。稍微简化一下,表达式可以是 lvalue 或 rvalue,但可以从一个转换为另一个。 lvalue 可以隐式转换为 rvalue;像move 所做的那样,可以通过强制转换来转换另一种方式。
如何实际实现这些引用?
就像任何其他引用一样 - 作为它绑定到的对象的别名或指针。唯一的区别是可以使用哪些类型的表达式来表示(并可能创建)绑定到引用的对象。
这些新设施是否允许类似auto x = &(3);
试图直接获取 rvalue 的地址,这是不允许的。由于问题是关于引用,而不是指针,因此允许将引用绑定到临时对象(其生命周期被延长以匹配引用):
auto && rvalue = 3;
auto const & const_lvalue = 3;
虽然不允许将其绑定到非 const lvalue 引用
auto & lvalue = 3; // ERROR