c++ - 关于智能指针中解引用和成员选择运算符的定义

标签 c++ operator-overloading smart-pointers dereference

在智能指针实现中,取消引用运算符和成员选择运算符总是定义如下。

T& operator* () const     // dereferencing operator
{
    return *(m_pRawPointer); 
}

T* operator->() const     // member selection operator
{
    return m_pRowPointer;
}

不太明白为什么前者是引用返回,后者是指针返回。只是为了区分他们还是其他一些原因? 更具体地说,我可以让解引用运算符通过指针返回,而另一个通过引用返回吗?

最佳答案

why the former is returned by reference

所以表达式 *thing 给出一个 lvalue 表示类型 T 的对象,就像如果 thing 是一个指针。

the latter is returned by pointer

因为这就是指定语言的方式。请注意,您永远不会直接使用 -> 的结果,而是始终使用 thing->member 形式的表达式。

如果 thing 是类类型,则通过调用 operator-> 对其进行评估,然后将 ->member 应用于其结果。为支持这一点,它必须返回一个指针或另一种同样重载 operator-> 的类类型。

can I make dereferencing operator returns by pointer

是的,但这会让人相当困惑,因为它的行为与将相同的运算符应用于指针不同。您必须说 **thing 才能访问 T

while the other one returns by reference

不,因为这会破坏语言关于重载运算符应该如何工作的内置假设,使其无法使用。

关于c++ - 关于智能指针中解引用和成员选择运算符的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29434001/

相关文章:

c++ - 使用 openGL GLM 和着色器的旋转不正确

c++ - 使用另一个类的参数复制构造函数

c++ - Windows 10:Pen(手写笔)在MFC应用程序上不起作用

c++ - 使用模板输出过载

c++ - 在智能指针的双图中查找原始指针

c++ - 为什么 weak_ptr 可以打破循环引用?

c++ - 打印一个值使程序运行?

c++ - 我应该如何正确重载使用 friend 的运算符?

c++ - 运算符重载的基本规则和惯用法是什么?

c++多个智能指针分配导致崩溃