有几次,在仔细阅读Boost库的文档时,我遇到了标记为" 可转换为bool
"的返回值(在该页面中搜索"convertible to bool",它大约是三分之一).我曾经偶然发现了一篇文章的斜向引用,解释了原因,但从未能找到所述论文(而且我再也找不到我所看到的参考页面).
任何人都可以解释为什么(以及何时)你应该返回"可兑换bool
"的东西,而不是简单地返回一个bool
?
"convertible to bool"仅仅意味着可以在布尔上下文中有意义地使用的任何东西(例如在if
条件中).这在隐式转换中很有意义.想象一下你想在布尔上下文中使用的对象,例如std::fstream
:
ifstream ifs("filename"); while (ifs >> token) cout "token " << token << " read." << endl;
在这里,ifs
可以转换为布尔值.嗯,实际上,事实并非如此.相反,它可以转换为可以转换为的东西bool
.这是为了防止这样的陈述:
int b = ifs;
原因是这样的语句很可能不是预期的,因此编译器应该阻止它.通过返回"convertible to bool"而不是a bool
,可以实现这一点,因为两个用户定义的隐式转换不能在一个表达式中链接.
在这种情况下,你可能想要查找安全的bool习语.Chris已经提到了一种可能的实现,使用void*
返回类型.通常,this
指针随后用于表示true
.这是STL使用的内容.然而,遗憾的是,这仍然存在缺陷.已经提出了几种替代方案(在我上面链接的文章中整齐地包含在内)并且据我所知,也被包含在C++ 0x中以供考虑.不过,我不了解这些提案的现状.
bool
s可以升级为int
s并且可以参与算术运算.当一个值只能用于真值测试时,这通常不是理想的结果.
convertible-to-to bool
通常类似于a void*
,其中null指针为false,其他任何内容都为true,但不能用于算术运算.