3

C++ 标准 (4/5) 左值到右值的转换不是在一元 & 运算符的操作数上完成的。

例如:

int x;
int *p = &x;

在上述情况下,都是p&x值吗?或者什么是合适的例子?

编辑:

那这个呢?

int &r = x;

我确定此语句中不会有任何转换,但我很困惑 & 运算符如何参与其中?

4

5 回答 5

4

引用说转换不适用于一元的操作数&(在本例中为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

于 2011-12-13T13:21:03.600 回答
2

将左值视为存储位置,将右值视为存储在那里的值。因此*p是左值并且&x是右值。但是,& 需要一个左值作为操作数 (x),但结果是一个右值,但这不会改变x自身。

于 2011-12-13T11:52:44.827 回答
1

标准引用基本上说&适用的操作数不会变成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;
于 2011-12-13T11:59:07.487 回答
0

C++ 标准 (4/5) 左值到右值的转换不是在一元 & 运算符的操作数上完成的。

这句话只是为了让你感到困惑。它没有其他目的。;)

最重要的引用是(引用 N3242,所以新术语有“prvalue”而不是 rvalue):

每当一个泛左值表达式作为操作数的操作数出现时,该操作数需要一个纯右值,左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换是应用于将表达式转换为纯右值。

因此,该语言可以用期望纯右值的构造和不期望纯右值的构造来描述。特别是,运算符&不“期望纯右值”(恰恰相反),因此左值到右值的隐式转换不是必需的,也不会应用。

标准描述并不一致:它从未明确表示在 中x += y,左值到右值的隐式转换不适用于x,大概是因为它非常明显。为什么作者觉得有必要明确地说 for &x,同样显而易见,我无法理解。

我认为这些提到应用隐式转换的说法应该被删除。该标准描述了发生了什么,而不是(无限多)没有发生的事情(除非它没有发生是非常令人惊讶的)。

隐式转换仅用于将表达式的“性质”调整为上下文的期望(上下文可以是表达式、语句、声明、ctor-init-list...)。

那这个呢?

int &r = x;

我敢肯定,这句话不会有任何转换,

因为这里不需要隐式转换。隐式转换仅在需要时应用。引用绑定不需要右值。

但我很困惑 & 运营商如何参与其中?

它不是。

于 2011-12-25T16:00:55.610 回答
0

“在操作数上”应指x右侧的 。也就是说,x语句int *p = &x;中的子表达式不是右值,而是左值。将此与 进行对比int a = b;,其中子表达式b 右值(转换后)。

于 2011-12-13T11:51:17.487 回答