VC7.1可能的一个BUG[关于Copy-Ctor和Direct-Ctor]
C++Standard 8.5节有这么一句:
if the initialization is direct-initialization,...,the applicable constructors is enumerated(13.3.1.3),and the best one is choosen through
overload resolution(13.3).
所谓direct-initialization就是具有
T t(init-expression); #1
形式的对象初始化。
其对应于
T t=init-expression;
这种copy-initialization形式。
这里,标准的意思是:对于#1这种情况,会将所有的ctor按照重载决议进行重载解析,并解析出一个best viable function。但是考虑下面情况:
class A
{
public:
A(int){}
A(const A&){}
};
void ctor(int){}
void ctor(const A&){}
class S
{
public:
template<class T>
operator T()
{
return T(0);
}
};
int main()
{
S s;
A a(s); //compiled using VC7.1
ctor(s);//not compiled using VC7.1
return 0;
}
这个例子说明vc7.1对这两种情况其实是区别对待的。对类对象的构造而言,vc7.1认为convert-->A应该比convert-->int好,但是对于普通函数来说又没有这种“优待”,因为s->int和s->A都是经过一个User Conversion