C++ 标准 (4/5) 左值到右值的转换不是在一元 & 运算符的操作数上完成的。
例如:
int x;
int *p = &x;
在上述情况下,都是p
左&x
值吗?或者什么是合适的例子?
编辑:
那这个呢?
int &r = x;
我确定此语句中不会有任何转换,但我很困惑 & 运算符如何参与其中?
C++ 标准 (4/5) 左值到右值的转换不是在一元 & 运算符的操作数上完成的。
例如:
int x;
int *p = &x;
在上述情况下,都是p
左&x
值吗?或者什么是合适的例子?
编辑:
那这个呢?
int &r = x;
我确定此语句中不会有任何转换,但我很困惑 & 运算符如何参与其中?
引用说转换不适用于一元的操作数&
(在本例中为x
)。所以 的操作数&
是一个左值。
这与一元运算+
符不同。如果您编写+x
,则左值到右值的转换将应用于子表达式x
(在这种情况下具有未定义的行为,因为x
尚未初始化)。
非正式地,“左值到右值转换”是指“读取值”。
引用没有说明 的结果,&
它实际上是一个右值。在int *p = &x;
:
x
是一个左值,指的是那个名字的变量,&x
是一个右值,它是初始化程序的一部分(特别是assignment-expression),p
既不是右值也不是左值,因为它不是(子)表达式。它是正在定义的变量的名称。在 C++ declarator 语法中,它是declarator-id(在 C++03 标准中为 8/4)。int &r = x;
根本不使用&
地址运算符。&
声明符中的字符只是对 int 的引用的语法含义,r
它没有获取r
. 在 C++ 声明符语法中,它实际上被称为ptr-operator。
将左值视为存储位置,将右值视为存储在那里的值。因此*p
是左值并且&x
是右值。但是,& 需要一个左值作为操作数 (x),但结果是一个右值,但这不会改变x
自身。
标准引用基本上说&
适用的操作数不会变成rvalue。它仍然是lvalue。
事实上, 的操作数&
不能是rvalue。它必须是lvalue,否则将能够获得标准不允许的临时对象的地址:
struct A{};
int *addressOfTemporary_int_object = &(int(10)); //error
A *addressOfTemporary_A_object = &A(); //error
正是因为 的操作数&
必须是左值,所以上面的表达式是非法的,作为子表达式int(10)
和A()
是右值表达式,因为它们创建了临时对象。
另请注意,即使表达式x
中的子表达式&x
是左值,应用&
on的结果x
也是右值。也就是说,表达式&x
是一个右值,不能出现在赋值运算符的右边:
&r = whatever; //illegal
我希望这可以帮助您理解报价。
那这个呢?
int &r = x;
这没关系。这里&
引用r
了 object x
。这里的&
is 不是操作符,也不与引用相关联r
,而是与类型相关联。将其写为:
int& r = x;
//Or if you use typedef as
typedef int& intref;
intref r = x;
C++ 标准 (4/5) 左值到右值的转换不是在一元 & 运算符的操作数上完成的。
这句话只是为了让你感到困惑。它没有其他目的。;)
最重要的引用是(引用 N3242,所以新术语有“prvalue”而不是 rvalue):
每当一个泛左值表达式作为操作数的操作数出现时,该操作数需要一个纯右值,左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换是应用于将表达式转换为纯右值。
因此,该语言可以用期望纯右值的构造和不期望纯右值的构造来描述。特别是,运算符&
不“期望纯右值”(恰恰相反),因此左值到右值的隐式转换不是必需的,也不会应用。
标准描述并不一致:它从未明确表示在 中x += y
,左值到右值的隐式转换不适用于x
,大概是因为它非常明显。为什么作者觉得有必要明确地说 for &x
,同样显而易见,我无法理解。
我认为这些提到不应用隐式转换的说法应该被删除。该标准描述了发生了什么,而不是(无限多)没有发生的事情(除非它没有发生是非常令人惊讶的)。
隐式转换仅用于将表达式的“性质”调整为上下文的期望(上下文可以是表达式、语句、声明、ctor-init-list...)。
那这个呢?
int &r = x;
我敢肯定,这句话不会有任何转换,
因为这里不需要隐式转换。隐式转换仅在需要时应用。引用绑定不需要右值。
但我很困惑 & 运营商如何参与其中?
它不是。
“在操作数上”应指x
右侧的 。也就是说,x
语句int *p = &x;
中的子表达式不是右值,而是左值。将此与 进行对比int a = b;
,其中子表达式b
是右值(转换后)。