取消引用是否返回对象本身或对对象的引用
Does dereference return the object itself or the reference to the object?
假设我有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
不可取消引用,则对表达式求值会导致未定义的行为。
代码末尾的赋值只是对对象的赋值,该对象是解引用表达式的值。
请注意,表达式永远不能是引用,因为值的类型始终是对象类型,而不是引用类型。引用类型对于将绑定到值很有用,但它们本身不是值。评估引用的值是被引用的对象。
相关文章:
- 引用对象成员函数的成员函数
- 从 Base 引用对象调用派生类的成员
- 转换引用对象的边界框?
- 现代编译器会优化只引用对象子集的局部变量吗
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 将 const 类型引用对象注册为类成员对象C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法用2D矢量成员引用对象
- 在由引用对象传递中访问由引用对象传递的变量
- 如何使用QString引用对象名称
- 使用自动迭代器引用对象
- C++ 在另一个对象中引用对象的当前状态
- 使用共享对象和引用对象进行引用计数
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 引用对象的动态类型何时可以更改
- 引用对象内部的指针
- C++从全局静态函数中引用对象
- C++如何仅在没有其他人直接或间接引用对象指针时删除该指针
- 如何使用C++引用对象
- 为什么引用对象仅保存特定类型的引用