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 The50
(源代码中写入的数字)是一个引用该临时变量的右值表达式。写入int&&a=50
,名称a
(充当表达式)可用于指代相同的临时,但a
(表达式)是左值。是的,即使它们被称为“右值引用”,右值引用的名称也是左值。