关于内置操作符、重载和模板函数
前几天看到这里的一个帖子,想回答来着,却已经结贴了。
这里重新提出来,换个角度讨论一下,呵呵:
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感觉上应该仍旧非法。