首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

满载的流转换运算符为什么是转换成void*而不是转换成 bool

2012-09-11 
重载的流转换运算符为什么是转换成void*而不是转换成 boolint iwhile(cini)cout i endlcini的

重载的流转换运算符为什么是转换成void*而不是转换成 bool
int i;
while(cin>>i)
  cout << i <<endl;
cin>>i的返回类型被转换成void*,通过operator void*()实现,这里为什么不直接operator bool()转换成bool型呢?
thinging in c++上是这么说的:习惯上优先使用函数operator void*()而不是operator bool(),因为从bool型隐式转换到int型会引起错误,在用整形表达式时,不应该错误的应用流。函数operator void*()在布尔表达式中应该隐式调用。
假如转换成bool型不就可以直接判断了吗,为什么会有从bool型隐式转换到int型引起错误呢?“在用整形表达式时,不应该错误的应用流。”这句话放在这里又是什么意思?



[解决办法]
按照字面意思理解,如果有operator bool()的话,那么下面的表达式合法:
if (3 + cin >> i)
如果使用operator void *()的话,则该表达式不合法。

很显然,我们不希望该表达式合法。因此,在此使用operator void *比operator bool ()要更好。
[解决办法]
如果有了 operator bool() const,那么下面的就都是合法的了:

std::cin + 567
std::cin / 9
std::cin << 12
double d = std::cin
……
[解决办法]
对于隐式转换,总会带来一些晦涩的、负面的影响,因此要保持对隐式转换的警觉。

就我所知,目前标准C++的IO流使用的是operator bool()而不是operator void*(),因为bool类型并不会自动隐式转换为int类型;反而后者在很多场景中容易产生极不意觉查的bug。

你可试试 void func(boo); void func(int);的函数重载,然后验证之。

热点排行