考虑以下代码。
#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
-变量不起作用,而操作的结果或在if()
- 声明没问题。
为什么会这样?看来我们必须对其进行布尔运算,然后转换才能起作用。
我做了什么让工作成为b = f1
-line 是很好的双爆炸:!!
。在如此现代的 C++ 代码中,它看起来就像古董。
EDIT:这也可以编译:
bool b = f1 || f1; /* OK */
注意std::function::operator 布尔值 http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool is explicit
转换函数,不允许隐式转换。所以bool b = f1;
行不通的。 (如果您使用显式转换,效果会很好静态类型转换 http://en.cppreference.com/w/cpp/language/static_cast like bool b = static_cast<bool>(f1);
.)
使用它在if()
- 声明没问题。
当与if
, operator!
or operator||
, 上下文转换 http://en.cppreference.com/w/cpp/language/implicit_conversion#Contextual_conversions才会生效,并且会考虑显式转换函数。
(自 C++11 起)
在以下五种情况下,类型bool
是预期的,并且如果声明则构建隐式转换序列bool t(e);
是格式良好的。即显式用户定义的转换函数,例如explicit T::operator bool() const;
被认为。这样的表达式 e 被称为根据上下文可转换为 bool.
- 控制表达
if
, while
, for
;
- 逻辑运算符
!
, &&
and ||
;
- 条件运算符
?:
;
-
static_assert
;
-
noexcept
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)