请考虑以下代码.
#include <functional>int main(voID){ std::function<voID()> f1; if (f1) { /* ok */ ... } bool b = f1; /* compile-error */ bool B = !f1; /* ok */ ...}
的std ::功能<>在某些情况下隐式转换为bool但不是全部转换为bool.将它分配给bool变量不起作用,而 *** 作的结果或在if() – 语句中使用它是正常的.
为什么会这样?看来我们必须对它进行布尔运算,然后转换才有效.
我做的工作b = f1-line是好的’双重爆炸:!!它看起来像现代C代码中的古董.
编辑:这也编译:
bool b = f1 || f1; /* OK */解决方法 注意 std::function::operator bool是显式转换函数,不允许隐式转换.所以bool b = f1;不行. (如果您使用 static_cast,如bool b = static_cast< bool>(f1);则显式转换将很有效.)
using it in an
if()
-statement is OK.
与if一起使用时,运算符!或运算符||,contextual conversions将生效,并将考虑显式转换函数.
(自C 11起)
总结In the following five contexts,the type
controlling Expression ofbool
is expected and the implicit conversion sequence is built if the declarationbool t(e);
is well-formed. that is,the explicit user-defined conversion function such asexplicit T::operator bool() const;
is consIDered. Such Expression e is saID to be contextually convertible to bool.if
,while
,for
; the logical operators!
,&&
and||
; the conditional operator?:
;static_assert
;noexcept
.
以上是内存溢出为你收集整理的为什么std :: function在C 11中没有隐式转换为bool?全部内容,希望文章能够帮你解决为什么std :: function在C 11中没有隐式转换为bool?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)