运营商在这里超载了什么?
operator T * ()
我知道operator方法具有以下结构:
type operator operator-symbol ( parameter-list )
假设我们有以下代码
template<typename T> class SmartPtr
{
public:
SmartPtr(T* data): member(data) {}
T* member;
T& operator * () { return *member; } //usage: *TObj
T*& operator () () { return member; } //usage: TObj()
operator T * () { return member; } //usage: ???
};
如果您在ideone上尝试,则无编译错误。那么这里发生了什么?
ADD: {I}我是否正确static_cast<T*>(TObj)
拨打operator T *
?我已经尝试过了here。
答案 0 :(得分:9)
这是一个转换运算符,它允许将类转换为T*
。用法:
T * p = TObj;
智能指针提供此功能可能不是一个好主意,因为它很容易意外地获取非智能指针。标准智能指针通过get()
函数提供显式转换,以防止意外转换。
答案 1 :(得分:0)
当SmartPtr
对象出现在表达式中时调用此运算符,但编译器没有可用于解析其使用的函数:如果T*
使用SmartPtr
是合法的}}出现,调用operator T*()
函数生成一个函数。这意味着my_smartptr->my_T_member
可以正常工作,f(T*); f(my_smart_ptr_to_T);
也可以。类似地,iostream
在C ++ 11中有operator bool()
(C ++ 03中operator void*()
,原因太麻烦而无法理解)。它与单个参数的隐式构造函数相反,如果编译器不能使用参数找到有效匹配,它可能会尝试使用该参数构造一个对象来代替使用。
答案 2 :(得分:0)
operator T * () { return member; }
它是一个所谓的转换运算符。它将SmartPtr类型的对象转换为类型T *。而且它是一个隐式转换操作符。因此,当编译器等待类型为T *的对象时,您可以使用SmartPtr类型的对象。 如果要添加关键字explicit,则可以使此转换运算符显式。例如
explicit operator T * () { return member; }