C++ C+中的右值引用+;举个简单的例子

C++ C+中的右值引用+;举个简单的例子,c++,C++,我正在努力理解右值引用的确切含义。 我看的每一个地方都有一些叫做完美转发的例子,听起来太复杂了 我只是想要一个关于什么是右值引用的清晰的基本示例,看看它们是否在诸如完美转发之类的主题之外被使用 我读过: 左值是指内存位置的表达式,允许我们通过&运算符获取该内存位置的地址。右值是不是左值的表达式 那么,这样说是否正确: An Rvalue Reference is a Reference to something that is not in the memory? Maybe it's in a

我正在努力理解
右值引用的确切含义。
我看的每一个地方都有一些叫做
完美转发
的例子,听起来太复杂了

我只是想要一个关于什么是右值引用的清晰的基本示例,看看它们是否在诸如完美转发之类的主题之外被使用

我读过:

左值是指内存位置的表达式,允许我们通过&运算符获取该内存位置的地址。右值是不是左值的表达式

那么,这样说是否正确:

An Rvalue Reference is a Reference to something that is not in the memory? Maybe it's in a register?
例如:

#include <iostream>

int main()
{
   int&& a = 50;  
   int b = 60;

  return 0;
}
#包括
int main()
{
int&&a=50;
int b=60;
返回0;
}
50
从技术上讲还不在内存中,但是
a
是对它的引用吗?
b
a
有什么不同吗


还有什么地方(很容易解释)可以使用它呢?

首先,标准没有定义内存或寄存器中是否存在某些内容。你不需要去想它。对于您来说,所有对象都像在内存中一样工作。在下,编译器可以将其中的一部分放入寄存器,只要不影响程序的工作方式

是的,您可以获取左值(位字段除外)和非右值的地址,但这是一种语言设计选择,而不是技术限制(大多数情况下没有意义,因此不允许这样做)。(左值vs右值)与事物在内存中的存储方式无关

我试图理解右值引用的确切含义

右值引用与左值引用类似。主要区别在于您可以使用什么来初始化它们。右值引用必须用右值初始化,左值引用必须用左值初始化(作为例外,
const
lvalue引用允许绑定到右值)

int&&a=50
之所以有效,是因为
50
是一个
int
和一个临时对象。(通常,“临时对象”是“右值”的同义词,但是。)

这种情况有点棘手,因为临时程序通常是在结束时销毁的(大约是在创建它们的代码行完成执行时)。但是这里,
50
的生存期是因为它绑定到一个引用

b和a有什么不同吗

int&& a = 50;  
int b = 60;

因为生命周期的延长-不,它们是等价的。也许它们之间有一些模糊的区别,但我想不出任何区别。

原因
int&&a=50工作不是很容易解释的。您可以执行
&a
并获得有效的
int*
,这表明
a
实际上是指内存中某个地方存在的东西。这不是一个关于右值引用何时有用的好例子。你已经学过“移动语义”了吗?
50
还不在内存中,当你把它的引用赋值给
a
时,它只是一个右值。尝试
int&a=50失败。是
int&a=50失败,但它不同于
int&&a=50。使用
int&
实际上有一个临时
int
,它是用
50
值偷偷创建的,
a
引用该对象并延长该对象的生命周期。使用
const int&a=50,您将得到相同的结果const int&a=50工作?为什么常量会产生差异呢?谢谢,那么说“右值引用是对没有地址的东西的引用”是正确的吗?@Josh这很接近,但并不完全正确。您可以编写
&a
并获取
a
所指对象的地址。你可以说,右值引用可以用你不能获取地址的东西初始化。@Josh是的,
a
是左值,
50
是右值。问题是,值类别(左值vs右值)是表达式的属性,而不是对象的属性。表达式指的是对象。假设您执行
int&&a=42;我想你可能误解了价值分类。它们指的是表达式而不是对象。因此,
50
是右值表达式,
a
是左值表达式。隐藏变量不是表达式,不能出现在表达式中,因此它没有值类别。@Josh The
50
(源代码中写入的数字)是一个引用该临时变量的右值表达式。写入
int&&a=50
,名称
a
(充当表达式)可用于指代相同的临时,但
a
(表达式)是左值。是的,即使它们被称为“右值引用”,右值引用的名称也是左值。