xueweizhong 2003年11月10日
加精
关于内置操作符、重载和模板函数
前几天看到这里的一个帖子,想回答来着,却已经结贴了。
这里重新提出来,换个角度讨论一下,呵呵:
struct A
{
int m_i;
};
typedef A* A_ptr;

struct B
{
A_ptr m_aptr;
operator A_ptr ()
{
return m_aptr;
}
};

int main()
{
B b;
(*b).i;
^^^^^^^ // ---#1
}

提问的人问#1处发生了什么隐式转换的问题。

下面是我的问题:

这里有几点比较疑惑的地方,提出来大家交流一下:
(1) *b导致operator* 函数的overload resolution
那么编译器是怎么找到合适的operator*的?
(2) 如果内置的operator*用模板实现,是否更合适:
template <typename T>
T& operator *(T*);
(3) 内置的operator *对任何类型T都有
T& operator* (T*); --------#2
函数原型。
但代表无穷多个函数的函数原型#2却并非
函数模板。
(4) (2)和(3)细微差别是什么?
(3)代表着重载,
(2)首先需要模板推导,推导完成后只剩下一个版本。
所以感觉上(2)比较干净。

(5) 一个“不可能的”回答问题:
比如
struct Foo
{
operator int* ();
operator char* ();
operator A_ptr ();
};
Foo foo;
将导致*foo的任何使用都是歧义的。

struct Foo
{
template <typename T>
operator T* ();
};
Foo foo;
A* ptr = *foo; ptr->m_i; 是合法的。
而(*foo).m_i感觉上应该仍旧非法。

...全文
90 点赞 收藏 29
写回复
29 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告