假设我有MyObj* ptr;
,并且*ptr
是对某个MyObj
对象的引用,或者它本身就是对象?
如果*ptr
是对象本身,那么为什么执行以下操作是合法的呢?
MyObj* someFunc(){
MyObj* p;
...
return p;
}
MyObj someOtherMyObjInstance;
*someFunc() = someOtherMyObjInstance.
答案 0 :(得分:1)
如果ptr
指向有效对象,则对表达式*ptr
的求值会导致对该对象的左值引用。
从C ++ 11标准(强调我的):
5.3.1一元运算符 [expr.unary.op]
1一元*运算符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是左值引用表达式指向的对象或函数。
答案 1 :(得分:1)
*ptr
是一个表达式。此表达式具有值,该值具有类型。如果ptr
是可解除引用的,则计算表达式的值是ptr
指向的对象,其类型为MyObj
,其值类别为“左值”。 (这意味着,例如,此值可以绑定到左值引用,并且您可以获取其地址。)如果另一方面ptr
不可解除引用,则评估表达式会导致未定义的行为。< / p>
代码末尾的赋值只是对象的赋值,它是解引用表达式的值。
请注意,表达式永远不能 引用,因为值的类型始终是对象类型,而不是引用类型。引用类型对绑定到值很有用,但它们本身不是值。评估引用的值是要引用的对象。