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

Does dereference return the object itself or the reference to the object?

本文关键字:引用 对象 返回 取消 是否      更新时间:2023-10-16

假设我有MyObj* ptr;,那么*ptr是对某个MyObj对象的引用,还是它本身就是对象?

如果*ptr本身就是对象,那么为什么这样做是合法的呢?

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

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

来自C++11标准(强调矿):

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

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

*ptr表达式。这个表达式有一个值,而这个值有一个类型。如果ptr是可解引用的,则计算表达式的值是ptr所指向的对象,其类型为MyObj,其值类别为"lvalue"。(例如,这意味着该值可以绑定到左值引用,并且可以获取其地址。)另一方面,如果ptr不可取消引用,则对表达式求值会导致未定义的行为。

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

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