当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Boost库会返回"可转换为`bool`"的东西,而不仅仅是返回`bool`s?》经验,为你挑选了2个好方法。

有几次,在仔细阅读Boost库的文档时,我遇到了标记为" 可转换为bool "的返回值(在该页面中搜索"convertible to bool",它大约是三分之一).我曾经偶然发现了一篇文章的斜向引用,解释了原因,但从未能找到所述论文(而且我再也找不到我所看到的参考页面).

任何人都可以解释为什么(以及何时)你应该返回"可兑换bool"的东西,而不是简单地返回一个bool



1> Konrad Rudol..:

"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"而不是a bool,可以实现这一点,因为两个用户定义的隐式转换不能在一个表达式中链接.

在这种情况下,你可能想要查找安全的bool习语.Chris已经提到了一种可能的实现,使用void*返回类型.通常,this指针随后用于表示true.这是STL使用的内容.然而,遗憾的是,这仍然存在缺陷.已经提出了几种替代方案(在我上面链接的文章中整齐地包含在内)并且据我所知,也被包含在C++ 0x中以供考虑.不过,我不了解这些提案的现状.



2> Chris Jester..:

bools可以升级为ints并且可以参与算术运算.当一个值只能用于真值测试时,这通常不是理想的结果.

convertible-to-to bool通常类似于a void*,其中null指针为false,其他任何内容都为true,但不能用于算术运算.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有