if语句中的函数名以奇怪的方式转换

nio*_*sus 6 c++ types casting function

使用此代码(有效的C++ 11):

#include <stdio.h>
#include <typeinfo>

bool my_awesome_func(int param) {
  return (param > 1);
}

int main(int argc, char const *argv[]) {
  fprintf(stderr, "type of my_awesome_func: %s\n", 
          typeid(my_awesome_func).name());
  if (my_awesome_func) {
    fprintf(stderr, "WHAT???\n");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题出在if声明中.虽然typeid返回一些看起来像的东西FbiE(我认为是函数类型的gcc语言)我不明白为什么这种类型被隐式转换成bool(只是一个例子,也适用int).

为什么if语句编译和评估为真?

M.M*_*M.M 9

您的代码中没有强制转换.演员表是一种明确的转换.我假设你在问:函数隐式转换为bool有什么作用?

答案是:函数转换为函数指针.然后bool通过隐式转换将函数指针转换为.该转换定义为产生:

  • false 对于空函数指针
  • true 对于任何其他函数指针

因此,在您的代码中,if (my_awesome_func)始终输入正文.(将实际函数转换为函数指针永远不会产生空指针).