有几次,在阅读 Boost 库的文档时,我遇到了标记为“可转换为bool
”的返回值(在该页面中搜索短语“可转换为布尔”,它大约下降了三分之一)。我曾经偶然发现对一篇解释其原因的论文的倾斜引用,但从未能够找到该论文(而且我再也找不到我在其中看到引用的页面)。
谁能解释为什么(以及何时)您应该返回“可转换为bool
”的东西,而不是简单地返回 a 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 idiom。Chris 已经提到了一种可能的实现,将void*
其用作返回类型。通常,this
然后使用指针来表示true
。这就是 STL 使用的内容。然而,不幸的是,这仍然存在缺陷。已经提出了几种替代方案(在我上面链接的文章中整齐地包装),据我所知,它们也已包含在 C++0x 中以供考虑。不过,我不知道这些提案的当前状态。
bool
s 可升级为int
s 并且可以参与算术运算。这通常不是期望的结果,当一个值应该只用于真值测试时。
convertible-to-bool
通常类似于 a void*
,其中空指针为假,其他任何东西都为真,但不能用于算术运算。
也许是为了表演?在 C/C++ 中,您可以对数字执行 if 语句(0 为假,其他为真)。转换为严格的布尔值是一个额外的操作,在许多情况下不需要。
我实际上并没有使用过boost,所以这只是一个猜测,但对我来说似乎是一个合理的选择。