2008-11-04 54 views
6

有几次,在阅读Boost库的文档时,我已经运行了标有“convertible to bool”(搜索那个页面“可转换为bool”的页面,大约下降了三分之一)的返回值。我曾经无意中发现了一篇斜体的文章,解释了其中的原因,但从来没有找到过这篇论文(而且我也无法再找到我所看到的参考文献)。为什么Boost库会将“可转换为`bool`”而不是仅仅返回`bool`s?

任何人都可以解释为什么(以及何时)你应该返回的东西是“可转换为bool”,而不是简单地返回bool

回答

25

“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中供考虑。不过,我并不了解这些提案的现状。

+0

这是我一直无法找到的文章。谢谢! – 2008-11-05 17:37:31

0

也许性能?在C/C++中,您可以对数字执行if语句(0为false,其他都为true)。转换为严格的布尔是一个额外的操作,在很多情况下,这是不需要的。

我实际上并没有使用boost,所以这只是一个猜测,但对我来说这似乎是合理的。

11

bool s可推广到int s并且可以参与算术运算。当一个值只用于真值测试时,这往往不是理想的结果。

一个convertible-to- bool通常类似于void*,其中空指针为false,其他任何内容都为true,但不能用于算术运算。

相关问题