对具有重载操作员>的类型进行就地销毁
In-place destruction on type with overloaded operator->
假设某类型Foo
有一个重载的operator->
返回一个Bar*
:
struct Foo
{
Bar* operator->();
};
如果我想从Foo
类中就地销毁返回的Bar
实例,我可以写下面的代码吗?
this->~Bar();
g++不喜欢这样的代码。如果我这样写,它可以工作:
(*this)->~Bar();
"递归转发规则"在这种情况下不适用吗?为什么不呢?
链接->
的规则,见于标准的13.5.6 [over.ref]
:
对于类型为
T
的类对象x
,如果T::operator->()
存在并且操作符被重载解析机制(13.3)选为最佳匹配函数,则表达式x->m
被解释为(x.operator->())->m
。
由于this
是一个指针,而不是一个类对象,所以它不适用
相反,这个规则在5.2.5 ([expr.ref]
)是适用的:
对于第二个选项(箭头),第一个表达式应该有指向完整类类型的指针。表达式
E1->E2
被转换成等价形式(*(E1)).E2
;5.2.5的剩余部分将只处理第一个选项(点)。
因为this
是指针,不是引用,而->
是指针,所以没有返回值来进行转发。考虑同样
shared_ptr<std::string>* ptr = // some init
ptr->push_back('0'); // error
this
是指向Foo类型对象的指针。您覆盖了对象的操作符->,而不是指针。
this->~Bar()
尝试调用Foo中的~Bar()方法。
(*this)->~Bar()
工作是因为调用了对象的->操作符。
相关文章:
- 是否使用cv::Point2f类型重载std::排序
- 如何使用common_type和模板递归类型重载运算符+
- 按返回类型重载函数模板
- 是否可以根据类型是整数类型还是浮点类型重载模板函数
- 使用 ostream 和枚举类型重载<<
- 如何根据数组参数项类型重载 IDL 中的函数
- 按参数中的向量类型重载函数
- 如何使用内置返回类型重载运算符?
- 同时使用参数重载和返回类型重载
- 使用子类型重载调用函数
- 按返回类型重载模板
- 基于参数函数参数类型重载函数模板
- C++类型 重载仅部分起作用
- 提升::任何构造函数 - 常量类型重载分辨率
- 按函子参数计数类型C++重载
- C++类型重载问题
- 按返回类型重载
- C++按返回类型重载函数
- 如何包装按类型重载的函数
- 使用专门的模板根据返回类型重载函数