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