【问题标题】:Why do Boost libraries return things "convertible to `bool`" rather than just returning `bool`s?为什么 Boost 库返回“可转换为 `bool`”的东西,而不仅仅是返回 `bool`s?
【发布时间】:2010-09-20 18:21:06
【问题描述】:

多次,在阅读 Boost 库的文档时,我遇到了标记为“convertible to bool”的返回值(在该页面中搜索“convertible to bool”这个短语,大约下降了三分之一) .我曾经偶然发现一篇论文的倾斜引用解释了其原因,但一直无法找到该论文(我再也找不到我在其中看到引用的页面)。

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

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    “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 中以供考虑。不过,我不知道这些提案的当前状态。

    【讨论】:

    • 那是我没能找到的文章。谢谢!
    • 当前状态是显式转换运算符,这使得安全布尔成语变得多余。
    • @Sebastian,是吗? “if (f)”会调用显式运算符 bool() 还是需要“if (bool(f))”?这不像标准将 if 的参数定义为布尔值,只是可以转换为布尔值。
    • @jmucchiello:是的,确实如此。此修正案的明确意图是解决条件表达式上下文中的当前缺陷。为此,例如的上下文if(cond) 将被视为显式转换,无需这样编写。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 1970-01-01
        • 2014-09-17
        • 1970-01-01
        • 2018-05-27
        • 2012-08-24
        • 2014-07-01
        • 1970-01-01
        • 2012-01-14
        相关资源
        最近更新 更多