BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #19260同步于 2009/2/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】转换操作符,类类型转换

Vampire
2009/2/15镜像同步1 回复
#include <iostream> using namespace std; class Integral; class SmallInt { public: SmallInt(int i): val(i) { cout << "int constructor" << endl; } SmallInt(Integral); operator int() const { cout << "to int" << endl; return val; } private: int val; }; class Integral { public: Integral(int i = 0): val(i) {} operator SmallInt() const { cout << "to SmallInt" << endl; return SmallInt(val); } operator int() const { return val; } friend class SmallInt; private: int val; }; SmallInt::SmallInt(Integral obj): val(obj.val) { cout << "Integral constructor" << endl; } void compute(SmallInt obj) { cout << "compute() invoked" << endl; } int main(int argc, char *argv[]) { Integral int_val(45); compute(int_val); return 0; } 这是按C++ primer 中文第四版460的例子写的,书上说main里那个compute函数的调用参数传递有二义性,Integral类型的对象int_val可以通过两种方式转换到SmallInt类型,即用Integral类的转换操作符或者用SmallInt类的构造函数。用gcc编译运行结果是,输出 Integral constructor compute() invoked 即调用的是SmallInt的构造函数 删除了参数为Integral对象的那个SmallInt构造函数之后,调用的才是转换操作符…… 请问这是什么原因呢? 谢谢~!
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
kmplayer机器人#1 · 2009/2/16
我的编译器也是这个结果. 二义性的问题,很难说为什么?