代码之家  ›  专栏  ›  技术社区  ›  Head Geek

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

  •  6
  • Head Geek  · 技术社区  · 16 年前

    在仔细阅读Boost库的文档时,我多次遇到标记为“ convertible to bool (在该页面上搜索短语“可转换为bool”,大约有三分之一的地方)。我曾经偶然发现一篇论文的斜引用,解释了其中的原因,但从未找到过这篇论文(我也找不到我在这两篇论文上看到的引用)。

    有人能解释一下为什么(以及何时)你应该归还“可转换为”的东西吗 布尔 “而不是简单地返回一个 布尔 ?

    3 回复  |  直到 16 年前
        1
  •  25
  •   Konrad Rudolph    16 年前

    可转换为bool意味着任何可以在布尔上下文中有意义地使用的东西(例如在 if 条件)。这在隐式转换中是有意义的。想象一下,你想在布尔上下文中使用一个对象,例如。 std::fstream :

    ifstream ifs("filename");
    while (ifs >> token)
        cout "token " << token << " read." << endl;
    

    在这里, ifs 可转换为布尔值。实际上,它不是。相反,它可以转换为某种东西,而这种东西反过来又可以转换为 bool 。这是为了防止此类声明:

    int b = ifs;
    

    原因是这样的语句很可能不是有意的,因此编译器应该阻止它 布尔 ,这是因为两个用户定义的隐式转换不能链接到一个表达式中。

    在这种情况下,您可能需要查找 safe bool idiom Chris已经提到了一种可能的实现方式,使用 void* 作为返回类型。通常 this 然后使用指针来表示 true 这就是STL所使用的。然而,不幸的是,这仍然存在缺陷。已经有人提出了几个替代方案(我在上面链接的文章中简洁地概括了这些方案),据我所知,这些方案也被纳入了C++0x以供考虑。不过,我不知道这些提议的现状。

        2
  •  11
  •   C. K. Young    16 年前

    bool s可以晋升 int s,可以参与算术运算。当一个值应该只用于真理测试时,这通常不是理想的结果。

    一辆敞篷车- 布尔 通常类似于 void* ,其中空指针为false,其他任何值为true,但不能用于算术运算。

        3
  •  0
  •   Herms    16 年前

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

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