使用重载运算符对类型进行就地销毁 ->

发布于 2024-11-28 19:16:01 字数 401 浏览 0 评论 0原文

假设某些类型 Foo 有一个重载的 operator-> ,它返回一个 Bar*

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

如果我想破坏返回的 Bar< /code> 实例位于 Foo 类中,我可以编写以下内容吗?

this->~Bar();

g++ 不喜欢那个代码。如果我这样写就可以了:

(*this)->~Bar();

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

Suppose some type Foo has an overloaded operator-> that returns a Bar*:

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

If I want to destruct the returned Bar instance in-place from within the Foo class, can I write the following?

this->~Bar();

g++ does not like that code. It works if I write this:

(*this)->~Bar();

Does the "rescursive forwarding rule" not apply in this case? Why not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

悍妇囚夫 2024-12-05 19:16:01

以下是链接 -> 的规则,可在标准的 13.5.6 [over.ref] 中找到:

对于类对象 x<,表达式 x->m 被解释为 (x.operator->())->m如果 T::operator->() 存在并且重载解析机制将运算符选为最佳匹配函数 (13.3),则为 T 类型的 /code> .


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

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

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

Here is the rule for chaining ->, found in 13.5.6 [over.ref] of the standard:

An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator->() exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3).

Since this is a pointer, not a class object, it doesn't apply.

Instead, this rule in 5.2.5 ([expr.ref]) is applicable:

For the second option (arrow) the first expression shall have pointer to complete class type. The expression E1->E2 is converted to the equivalent form (*(E1)).E2; the remainder of 5.2.5 will address only the first option (dot).

眼眸里的快感 2024-12-05 19:16:01

因为 this 是一个指针,不是引用,并且指针的 -> 没有返回进行转发的值。等价考虑

shared_ptr<std::string>* ptr = // some init
ptr->push_back('0'); // error

Because this is a pointer and not a reference and -> for a pointer doesn't have a return value for forwarding to take place on. Consider equivalently

shared_ptr<std::string>* ptr = // some init
ptr->push_back('0'); // error
和我恋爱吧 2024-12-05 19:16:01

this 是一个指向 Foo 类型对象的指针。
您覆盖了运算符 ->对于对象,而不是指针。

this->~Bar()

尝试调用 Foo 中的 ~Bar() 方法。

(*this)->~Bar()

有效,因为你调用 ->对象的运算符。

this is a pointer to an object of type Foo.
You overwrote the operator -> for the object, not the pointer.

this->~Bar()

attempts to call the ~Bar() method in Foo.

(*this)->~Bar()

works because you call the -> operator of the object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文