![](/img/trans.png)
[英]How to improve dereferencing of smart pointer that is a member variable of class
[英]Regarding definition of dereferencing and member selection operators in smart pointer
在智能指针实现中,始终将解除引用运算符和成员选择运算符定义如下。
T& operator* () const // dereferencing operator
{
return *(m_pRawPointer);
}
T* operator->() const // member selection operator
{
return m_pRowPointer;
}
我不太明白为什么前者是通过引用返回的,而后者是通过指针返回的。 只是为了区分它们还是其他原因? 更具体地说,我可以使解引用运算符通过指针返回,而另一个通过引用返回吗?
为什么前者通过引用返回
因此,表达式*thing
给出了一个表示T
类型对象的左值 ,就像thing
是指针一样。
后者由指针返回
因为这就是指定语言的方式。 请注意,您永远不会直接使用->
的结果,而是始终使用thing->member
形式的表达式。
如果thing
是一个类类型,则通过调用operator->
进行评估,然后将->member
应用于结果。 为了支持这一点,它必须返回一个指针或另一个也会重载operator->
类类型。
我可以通过指针使解引用运算符返回
是的,但这会造成混乱,因为它与应用同一运算符的指针的行为不同。 您必须说些**thing
才能访问T
而另一个通过引用返回
不,因为那会破坏语言关于重载运算符应如何工作的内置假设,从而使其无法使用。
取消引用运算符按引用返回而成员选择运算符按指针返回的原因是将使用智能指针的语法与使用原始指针的语法进行对齐:
int* p = new int(42);
*p = 7;
std::unique_ptr<int> p(new int(42));
*p = 7;
您绝对可以让您的取消引用运算符返回您想要的任何内容:
struct IntPtr {
int* p;
int* operator*() { return p; }
};
但是,这对于您的用户在不得不编写时会造成很大的困扰:
IntPtr p{new int{42}};
**p = 7;
箭头运算符在[over.ref]中有所不同:
表达式
x->m
解释为(x.operator->())->m
因此,您必须返回可以在其上调用->m
,否则您将收到类似(来自gcc)的错误:
错误:'operator->()'的结果产生非指针结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.