VC7.1可能的一个BUG[关于Copy-Ctor和Direct-Ctor]

pongba 2003-11-19 08:11:11
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
...全文
74 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyunet 2003-11-25
  • 打赏
  • 举报
回复
我在vc7.1和dev c++上都编译了你的例子,vc下确实如你所说,出乎我的意料,而在dev c++下,两个句子都不能通过编译。我觉得这样才是正确的。我原来以为A a(s)的形式一定不会调用拷贝构造函数,看来这种想法是错误的。呵呵。
pongba 2003-11-20
  • 打赏
  • 举报
回复
请注意,拷贝构造函数接受的是const A&,这是可以绑定到临时对象的,所以,s转向A也是可以的,而且不是你说的A a(s)肯定会调用A::A(int),事实是调用了A::A(const A&),在VC7.1上。例子是没有错的,我在VC7.1上试过
xiaoyunet 2003-11-20
  • 打赏
  • 举报
回复
你的例子不正确,A a(s);肯定会调用A::A(int),应为另外的一个是拷贝构造函数。此时s会徽转形成int,而对于重载的ctro函数,则转换为int和转换位A都同样好,所以会出现抹另两课的调用导致编译错误。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧