C++ C++;:异常运算符重载

C++ C++;:异常运算符重载,c++,operator-overloading,operator-keyword,static-cast,C++,Operator Overloading,Operator Keyword,Static Cast,什么运算符在这里重载 运算符T*() 我知道运算符方法具有以下结构: 类型运算符符号(参数列表) 假设我们有以下代码 template<typename T> class SmartPtr { public: SmartPtr(T* data): member(data) {} T* member; T& operator * () { return *member; } //usage: *TObj T*& op

什么运算符在这里重载

运算符T*()

我知道运算符方法具有以下结构:

类型运算符符号(参数列表)

假设我们有以下代码

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: ???
};
模板类SmartPtr
{
公众:
SmartPtr(T*data):成员(data){}
T*成员;
运算符*(){return*member;}//用法:*TObj
T*&运算符()(){return member;}//用法:TObj()
运算符T*(){return member;}//用法:???
};
如果在上尝试,则不会出现编译错误。这是怎么回事

添加:静态广播(TObj)呼叫
操作员T*
对吗?我已经试过了。

这是一个转换运算符,它允许将类转换为
T*
。用法:

T * p = TObj;

智能指针提供此功能可能不是一个好主意,因为它很容易意外地获得非智能指针。标准智能指针通过
get()
函数提供显式转换,以防止意外转换。

当表达式中出现
SmartPtr
对象时,会调用此运算符,但是编译器没有可用的函数来解决它的用法:如果在出现
SmartPtr
的地方使用
T*
是合法的,则调用
操作符T*()
函数来生成一个。这意味着
my_smartptr->my_T_成员可以工作,就像
f(T*)一样;f(my_smart_ptr_to_T)。类似地,
iostream
s在C++11中有一个
operator bool()
operator void*()
在C++03中,由于过于繁琐的原因而不必理会)。它与单个参数的隐式构造函数相反,如果编译器没有使用该参数找到有效的匹配项,它可能会尝试使用该参数构造一个要使用的对象

operator T * () { return member; }
这就是所谓的转换运算符。它将SmartPtr类型的对象转换为T*类型。此外,它是一种隐式转换操作。因此,当编译器等待T*类型的对象时,可以使用SmartPtr类型的对象。 如果要添加关键字explicit,可以使此转换运算符显式。比如说

explicit operator T * () { return member; }

这是一个转换运算符+1它是如何工作的?也就是说,在发动机罩下,它是否为静态铸件(成员)
?只是curious@legends2k:不,没有演员阵容。它只是在需要转换时调用这个操作符;所以我的用法示例相当于
T*p=TObj.operator T*()
,相当于
T*p=TObj.member
我问函数内部发生了什么,比如说我在
SmartPtr
中包装了
int*p=TObj
不应该工作,对吧?为什么?成员变成
T*
会发生什么?我有点奇怪,但是
static\u cast(成员)
call调用了这个操作符。看看我更新的ideone代码:@legends2k:member
没有发生任何事情;它已经是
T*
,因此操作员可以简单地返回它(就像在OP的代码中一样)。通常的转换规则阻止您使用它初始化不兼容的指针类型。