取消引用是否返回对象本身或对象的引用?

时间:2015-11-17 23:15:50

标签: c++ pointers reference lvalue

假设我有MyObj* ptr;,并且*ptr是对某个MyObj对象的引用,或者它本身就是对象?

如果*ptr是对象本身,那么为什么执行以下操作是合法的呢?

MyObj* someFunc(){
  MyObj* p;
  ...
  return p;
}

MyObj someOtherMyObjInstance;
*someFunc() = someOtherMyObjInstance. 

2 个答案:

答案 0 :(得分:1)

如果ptr指向有效对象,则对表达式*ptr的求值会导致对该对象的左值引用。

从C ++ 11标准(强调我的):

  

5.3.1一元运算符 [expr.unary.op]

     

1一元*运算符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是左值引用表达式指向的对象或函数。

答案 1 :(得分:1)

*ptr是一个表达式。此表达式具有值,该值具有类型。如果ptr是可解除引用的,则计算表达式的值是ptr指向的对象,其类型为MyObj,其值类别为“左值”。 (这意味着,例如,此值可以绑定到左值引用,并且您可以获取其地址。)如果另一方面ptr不可解除引用,则评估表达式会导致未定义的行为。< / p>

代码末尾的赋值只是对象的赋值,它是解引用表达式的值。

请注意,表达式永远不能 引用,因为值的类型始终是对象类型,而不是引用类型。引用类型对绑定到值很有用,但它们本身不是值。评估引用的值是要引用的对象。