【问题标题】:Why std::function does not implicitly convert to bool in C++11? [duplicate]为什么 std::function 在 C++11 中不会隐式转换为 bool? [复制]
【发布时间】:2016-09-20 09:21:28
【问题描述】:

考虑以下代码。

#include <functional>

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

    bool b = f1; /* compile-error */
    bool B = !f1; /* ok */
    ...
}

std::function&lt;&gt; 在某些情况下隐式转换为 bool,但并非在所有情况下都如此。将其分配给bool-变量不起作用,而操作的结果或在if()-语句中使用它是可以的。

为什么会这样?看来我们必须对其进行布尔运算,然后才能进行转换。

我为b = f1-line 所做的工作是好的 ol' double bang:!!。在这种现代 C++ 代码中,它看起来就像是古董。

EDIT:这也可以编译:

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

【问题讨论】:

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


【解决方案1】:

注意std::function::operator boolexplicit的转换函数,不允许隐式转换。所以bool b = f1; 不起作用。 (如果你像bool b = static_cast&lt;bool&gt;(f1);一样使用static_cast,那么显式转换会很有效。)

if()-statement 中使用它是可以的。

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

(C++11 起)

在以下五个上下文中,类型 bool 是预期的,并且如果声明 bool t(e); 格式正确,则会构建隐式转换序列。即考虑explicit T::operator bool() const;等显式用户自定义转换函数。这样的表达式 e 被称为 在上下文中可转换为 bool

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

【讨论】:

  • 因此,即使请求显式,也存在隐式、显式和上下文隐式转换。很高兴知道。
  • @PatrickB。由于!bool 转换仍然隐式应用,即使它被声明为explicit
  • 那么 !!f1 会为此工作吗?
  • @Goosebumps 是的,!f1 会导致f1 转换为bool,转换后的值应用到!,然后再将结果应用到!
猜你喜欢
  • 2022-01-23
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2020-10-28
  • 2010-12-12
相关资源
最近更新 更多