我在 C++ 中使用过 std::move
和 std::forward
。我的问题是:标准库实际上是如何实现这些功能的?
如果左值是您可以获得地址的东西,而右值完全不是左值,那么您如何实际实现这些引用?
这些新设施是否允许:
auto x = &(3);
或者类似的东西?您能否获得对不仅仅是 std::move
/forward
返回左值的右值的引用?
希望这些问题是有道理的。谷歌没找到好的资料,只有完美转发的教程等。
最佳答案
How is it possible to get a reference to an rvalue?
从概念上讲,rvalue 表达式创建一个临时对象,或者有时表示一个现有对象。它可以像任何其他对象一样绑定(bind)到引用;但是,为了避免混淆,该语言只允许 rvalue 和 const
lvalue 引用。
I have used std::move and std::forward in C++. My issue is how this is actually implemented by the compiler?
move
简单地返回一个rvalue 对其参数的引用,相当于
static_cast<typename remove_reference<T>::type&&>(t)
函数调用的结果是一个右值(具体来说,一个xvalue),所以它可以绑定(bind)到一个rvalue引用,其中函数参数不能。这允许您明确地从 lvalue 移动,使用 move
将其转换为 rvalue,同时不允许您意外地从它移动。
forward
类似,但重载以返回一个 rvalue 引用到一个 rvalue 或 rvalue 引用,并且对任何其他内容的左值引用。
If an l-value is something you can get the address of
这或多或少是正确的。官方定义是“指定一个函数或一个对象”的表达,那些是有地址的东西。
and an r-value is exclusively not an l-value
不是真的。稍微简化一下,表达式要么是左值,要么是右值,但可以从一个转换为另一个。 左值 可以隐式转换为右值;可以像 move
那样使用强制转换来转换另一种方式。
how can you actually implement these references?
就像任何其他引用一样 - 作为它绑定(bind)到的对象的别名或指针。唯一的区别是可以使用哪种表达式来表示(并可能创建)绑定(bind)到引用的对象。
Do these new facilities allow for something like
auto x = &(3);
它试图直接获取 rvalue 的地址,这是不允许的。由于问题是关于引用而不是指针,因此允许以下内容,将引用绑定(bind)到临时对象(其生命周期被延长以匹配引用):
auto && rvalue = 3;
auto const & const_lvalue = 3;
虽然不允许将其绑定(bind)到非常量 lvalue 引用
auto & lvalue = 3; // ERROR
关于c++ - 如何获得对右值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28458616/