为什么std :: function在C ++ 11中没有隐式转换为bool?

时间:2016-09-20 09:21:29

标签: c++ function c++11 implicit-conversion std-function

请考虑以下代码。

#include <functional>

int main(void)
{
    std::function<void()> f1;
    if (f1) { /* ok */
        ...
    }

    bool b = f1; /* compile-error */
    bool B = !f1; /* ok */
    ...
}
在某些情况下,

std::function<>会隐式转换为bool,但在所有情况下都不会转换为bool。将它分配给bool - 变量不起作用,而操作的结果或在if() - 语句中使用它是正常的。

为什么会这样?看来我们必须对它进行布尔运算,然后转换就可以了。

我做的工作b = f1 - 行是很好的事情。双重爆炸:!!。它看起来像现代C ++中的古董 - 代码。

编辑:这也编译:

bool b = f1 || f1; /* OK */

1 个答案:

答案 0 :(得分:7)

请注意,std::function::operator boolexplicit转换函数,不允许隐式转换。所以bool b = f1;将不起作用。 (如果您使用bool b = static_cast<bool>(f1);之类的static_cast,则显式转换效果会很好。)

  

if()语句中使用它是可以的。

ifoperator!operator||一起使用时,contextual conversions将生效,并且会考虑显式转换功能。

(自C ++ 11起)

  

在以下五个上下文中,类型bool是预期的,如果声明bool t(e);格式正确,则构建隐式转换序列。也就是说,考虑了显式的用户定义转换函数,例如explicit T::operator bool() const;。这样的表达式e被认为是在语境上可转换为bool

     
      
  • 控制ifwhilefor;
  • 的表达   
  • 逻辑运算符!&&||;
  •   
  • 条件运算符?:;
  •   
  • static_assert;
  •   
  • noexcept
  •