【问题标题】:Is this pointer an r-value? [duplicate]这个指针是 r 值吗? [复制]
【发布时间】:2014-11-23 23:02:38
【问题描述】:

我知道的是:

  1. L-Value 是一个表达式(可以是单个变量表达式,即 x),它有一些地址(意味着它存储在内存中并且可以在当前表达式的范围之外被引用)。

  2. “this 指针”指向对象本身,这意味着它包含对象的地址,这反过来意味着它是一个 L 值(根据第 1 点的定义)。
我想知道的是:

  1. “这个指针”真的是 L-Value 吗?因为在帖子“Type of 'this' pointer”中,人们说“这个指针”不是 L 值

  2. 如果“这个指针”不是 L 值,那么它是 R 值还是其他?

【问题讨论】:

  • 你链接到的帖子似乎很好地解释了这个问题。
  • 该帖子略有不同,并且在不同的上下文中我只需要重点回答这就是为什么我以项目符号形式发布我的问题。我的意思是是/否类型的答案。
  • 但是 vsoftco 在我在我的问题中提到的帖子中很多人自信地说“这个指针”不是 L 值,或者他们说“这个指针”是 R 值,这就是我感到困惑的原因。因为我认为“这个指针”是一个 L 值,而那个帖子中的人说它不是一个 L 值
  • “L 值是一个表达式 [...],它有一些地址” 表达式没有地址。内存区域(即对象)具有地址。表达式可以引用一个对象,或者产生一个对象(除其他外)。
  • 理解价值类别需要理解语言抽象,这是许多程序员难以解决的问题,只能通过经验和学习才能真正获得。

标签: c++


【解决方案1】:

您对 lvalues 的基本描述从幼稚的角度来看是一个相当好的一般规则,但在存在 lvalue-to-rvalue 用于表达式评估的转换,并且它不考虑诸如 this 关键字之类的明显异常。

由于this 本身不是一个您可以修改或认为真正“存储”在任何地方的指针——回想一下,它的值是由编译器根据上下文自动确定的——委员会决定最好将它作为右值表达式。

因此,您对内存地址的推理并不完全正确:this,作为指针,当然包含内存地址作为其物理值(在典型系统上)但这并不意味着它自己有一个。尝试获取其地址:&this 无法使用。

【讨论】:

  • 我喜欢这个解释(它直接回答了 OP 的问题)。提供对委员会决定的参考,我会对此表示赞同;-)
  • 那么猜测是,这就像一个常量变量,其地址对程序员不可见,程序员也无法修改它,但它的地址在编译器内部是已知的,它的值是由编译器本身根据上下文更改,对吧?
  • 不完全是:const 变量的地址对程序员是可见的。
  • 对不起,我应该这样说“这就像一个常量变量,但它的地址不可见......”我的意思是“像常量”在上下文中不可修改而不是可见性。在“this 指针”的情况下,我们既不能知道指针本身的地址,也不能获取它的值(“this”指向的对象的地址,我的意思是不能这样做 myptr = this;)对吗?
  • @jdigital:标准是对委员会决定的参考。也就是说,如果委员会没有决定将 this 设为 rvalue 表达式,那么它就不会是一个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2011-07-08
  • 1970-01-01
  • 2015-02-16
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多