c++ - 如何获得对右值的引用?

标签 c++ c++11 rvalue-reference

我在 C++ 中使用过 std::movestd::forward。我的问题是:标准库实际上是如何实现这些功能的?

如果左值是您可以获得地址的东西,而右值完全不是左值,那么您如何实际实现这些引用?

这些新设施是否允许:

auto x = &(3); 

或者类似的东西?您能否获得对不仅仅是 std::move/forward 返回左值的右值的引用?

希望这些问题是有道理的。谷歌没找到好的资料,只有完美转发的教程等。

最佳答案

How is it possible to get a reference to an rvalue?

从概念上讲,rvalue 表达式创建一个临时对象,或者有时表示一个现有对象。它可以像任何其他对象一样绑定(bind)到引用;但是,为了避免混淆,该语言只允许 rvalueconst 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 引用到一个 rvaluervalue 引用,并且对任何其他内容的左值引用。

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/

相关文章:

c++ - 为什么多线程的 for 循环没有单线程的性能好?

c++ - 带有双括号的 decltype((x)) 是什么意思?

C++0x 右值引用模板参数推导

c++ - 为什么构造函数需要范围解析来在主体之外定义它?

c# - 映射到程序的虚拟驱动器

c++ - 如何更新无模式对话框

c++ map迭代器不从第一项开始

c++ - 如何使用 C++ 模板推断编译时 const char 字符串的大小?

java - 在 C++ 中模拟 Java 枚举

c++ - C++11 中operator=(std::promise &&) 的结果是什么?