具有重载运算符的类型的就地破坏 - >

时间:2011-08-09 13:05:26

标签: c++ operator-overloading destructor forwarding

假设某个类型Foo的重载operator->返回Bar*

struct Foo
{
    Bar* operator->();
};

如果我想在Bar类中就地取消返回的Foo实例,我可以写下以下内容吗?

this->~Bar();

g ++不喜欢那段代码。如果我写这个就行了:

(*this)->~Bar();

在这种情况下,“递归转发规则”不适用吗?为什么不呢?

3 个答案:

答案 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将被解释为xT类对象T::operator->()通过重载解析机制匹配函数(13.3)。

由于this是指针而不是类对象,因此不适用。

相反,5.2.5([expr.ref])中的此规则适用:

  

对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针。表达式E1->E2将转换为等效形式(*(E1)).E2; 5.2.5的其余部分将仅解决第一个选项(点)。