有几次,在阅读Boost库的文档时,我已经运行了标有“convertible to bool
”(搜索那个页面“可转换为bool”的页面,大约下降了三分之一)的返回值。我曾经无意中发现了一篇斜体的文章,解释了其中的原因,但从来没有找到过这篇论文(而且我也无法再找到我所看到的参考文献)。为什么Boost库会将“可转换为`bool`”而不是仅仅返回`bool`s?
任何人都可以解释为什么(以及何时)你应该返回的东西是“可转换为bool
”,而不是简单地返回bool
?
有几次,在阅读Boost库的文档时,我已经运行了标有“convertible to bool
”(搜索那个页面“可转换为bool”的页面,大约下降了三分之一)的返回值。我曾经无意中发现了一篇斜体的文章,解释了其中的原因,但从来没有找到过这篇论文(而且我也无法再找到我所看到的参考文献)。为什么Boost库会将“可转换为`bool`”而不是仅仅返回`bool`s?
任何人都可以解释为什么(以及何时)你应该返回的东西是“可转换为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”而不是bool
,可以实现此目的,因为两个用户定义的隐式转换不能在一个表达式中链接。
在这种情况下,您可能要查找safe bool idiom。克里斯已经提到了一种可能的实现,使用void*
作为返回类型。通常,this
指针用于表示true
。这是STL所使用的。然而,这很不幸仍然有缺陷。已经提出了几种替代方案(整齐地包装在我上面链接的文章中),据我所知,也包含在C++ 0x中供考虑。不过,我并不了解这些提案的现状。
也许性能?在C/C++中,您可以对数字执行if语句(0为false,其他都为true)。转换为严格的布尔是一个额外的操作,在很多情况下,这是不需要的。
我实际上并没有使用boost,所以这只是一个猜测,但对我来说这似乎是合理的。
bool
s可推广到int
s并且可以参与算术运算。当一个值只用于真值测试时,这往往不是理想的结果。
一个convertible-to- bool
通常类似于void*
,其中空指针为false,其他任何内容都为true,但不能用于算术运算。
这是我一直无法找到的文章。谢谢! – 2008-11-05 17:37:31