c++ - 会发生左值到右值的转换吗?

标签 c++ implicit-conversion lvalue rvalue lvalue-to-rvalue

C++ Standard (4/5) the lvalue-to-rvalue conversion is not done on the operand of the unary & operator.

例如:

int x;
int *p = &x;

在上面的例子中,p&x 都是左值吗?或者什么是合适的例子?

编辑:

这个呢?

int &r = x;

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

最佳答案

引用表明转换不适用于一元&(在本例中为x)的操作数。所以 & 的操作数是一个左值。

这与一元运算符 + 不同。如果您编写 +x,则左值到右值的转换 应用于子表达式 x(在这种情况下具有未定义的行为,因为 x 还没有被初始化)。

通俗地说,“左值到右值转换”的意思是“读取值”。

引用没有说明 &结果,它实际上是一个右值。在 int *p = &x; 中:

  • x 是一个左值,指的是那个名字的变量,
  • &x 是一个右值,它是初始化程序的一部分(具体来说,是一个赋值表达式),
  • p 既不是右值也不是左值,因为它不是(子)表达式。它是正在定义的变量的名称。在 C++ 声明符语法中,它是 declarator-id(在 C++03 标准中为 8/4)。

int &r = x; 根本不使用 & 地址运算符。声明符中的 & 字符只是表示 r 是对 int 的引用的语法,它不采用 r 的地址。在 C++ 声明符语法中,它实际上称为 ptr-operator

关于c++ - 会发生左值到右值的转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488606/

相关文章:

c# - 有没有办法检查 memcached 是否已重新启动?

c# - 从 IEnumerable<int> 到 IEnumerable<dynamic> 的隐式转换

c - int *x[] 和 int (*x)[] 的区别?

c++ - 引用类型删除的 void*

c - C 中左操作数必须是左值

c++ - 当 Execute() 在 C++ Builder 中终止时,不调用 OnTerminate() 方法

c++ - GLSL 链接错误

python - 从 C++ 运行 .py 脚本

c++ - 为什么在这种情况下 friend 重载运算符优于转换运算符

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?