6

有几次,在阅读 Boost 库的文档时,我遇到了标记为“可转换为bool”的返回值(在该页面中搜索短语“可转换为布尔”,它大约下降了三分之一)。我曾经偶然发现对一篇解释其原因的论文的倾斜引用,但从未能够找到该论文(而且我再也找不到我在其中看到引用的页面)。

谁能解释为什么(以及何时)您应该返回“可转换为bool”的东西,而不是简单地返回 a bool

4

3 回答 3

25

“可转换为布尔值”仅表示可以在布尔上下文中有意义地使用的任何内容(例如,在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 中以供考虑。不过,我不知道这些提案的当前状态。

于 2008-11-04T20:26:52.400 回答
11

bools 可升级为ints 并且可以参与算术运算。这通常不是期望的结果,当一个值应该只用于真值测试时。

convertible-to-bool通常类似于 a void*,其中空指针为假,其他任何东西都为真,但不能用于算术运算。

于 2008-11-04T20:25:27.783 回答
0

也许是为了表演?在 C/C++ 中,您可以对数字执行 if 语句(0 为假,其他为真)。转换为严格的布尔值是一个额外的操作,在许多情况下不需要。

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

于 2008-11-04T20:17:13.213 回答