为什么Boost库会返回“可转换为`bool`”的东西,而不仅仅是返回`bool`s?

时间:2008-11-04 19:59:39

标签: c++ boost

有几次,在仔细阅读Boost库的文档时,我遇到了标记为“convertible to bool”的返回值(在该页面上搜索“可转换为bool”这一短语,大概是三分之一下)。我曾经偶然发现了一篇文章的斜向引用,解释了原因,但从来没有找到过论文(而且我再也找不到参考的页面了。)

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

3 个答案:

答案 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,所以这只是猜测,但对我来说这似乎是合理的。