假设某个类型Foo
的重载operator->
返回Bar*
:
struct Foo
{
Bar* operator->();
};
如果我想在Bar
类中就地取消返回的Foo
实例,我可以写下以下内容吗?
this->~Bar();
g ++不喜欢那段代码。如果我写这个就行了:
(*this)->~Bar();
在这种情况下,“递归转发规则”不适用吗?为什么不呢?
答案 0 :(得分:3)
因为this
是一个指针而不是一个引用,而->
指针不会拥有一个返回值以便转发放在。等效地考虑
shared_ptr<std::string>* ptr = // some init
ptr->push_back('0'); // error
答案 1 :(得分:3)
this
是指向Foo类型对象的指针。
你覆盖了运营商 - &gt;对象而不是指针。
this->~Bar()
尝试在Foo中调用~Bar()方法。
(*this)->~Bar()
有效,因为你打电话给 - &gt;对象的操作者。
答案 2 :(得分:3)
以下是链接->
的规则,可在标准的13.5.6 [over.ref]
中找到:
如果
x->m
存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m
将被解释为x
类T
类对象T::operator->()
通过重载解析机制匹配函数(13.3)。
由于this
是指针而不是类对象,因此不适用。
相反,5.2.5([expr.ref]
)中的此规则适用:
对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针。表达式
E1->E2
将转换为等效形式(*(E1)).E2
; 5.2.5的其余部分将仅解决第一个选项(点)。