有几次,在仔细阅读Boost库的文档时,我遇到了标记为“convertible to bool
”的返回值(在该页面上搜索“可转换为bool”这一短语,大概是三分之一下)。我曾经偶然发现了一篇文章的斜向引用,解释了原因,但从来没有找到过论文(而且我再也找不到参考的页面了。)
任何人都可以解释为什么(以及何时)应该返回“可转换为bool
”的内容,而不是简单地返回bool
?
答案 0 :(得分: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。 Chris已经提到了一种可能的实现,使用void*
作为返回类型。通常,this
指针随后用于表示true
。这是STL使用的内容。然而,遗憾的是,这仍然存在缺陷。已经提出了几种替代方案(在我上面链接的文章中巧妙地包含在内)并且据我所知,也被包含在C ++ 0x中以供考虑。不过,我不了解这些提案的现状。
答案 1 :(得分:11)
bool
可以被int
推荐,并且可以参与算术运算。当一个值只能用于真值测试时,这通常不是理想的结果。
convertible-to - bool
通常类似于void*
,其中空指针为false,其他任何内容都为true,但不能用于算术运算。
答案 2 :(得分:0)
也许是为了表现?在C / C ++中,您可以对数字执行if语句(0表示false,其他任何条件都为true)。转换为严格的bool是一项额外的操作,在许多情况下不需要。
我实际上并没有使用过boost,所以这只是猜测,但对我来说这似乎是合理的。