c++ - if 语句中的函数名以一种奇怪的方式转换

标签 c++ function types casting

使用此代码(有效的 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;
}

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

为什么 if 语句编译并计算为真?

最佳答案

您的代码中没有转换。强制转换是一种显式转换。我假设您在问:将函数隐式转换为 bool 有什么作用?

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

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

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

关于c++ - if 语句中的函数名以一种奇怪的方式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003680/

相关文章:

C++:引用动态内存

模板中的 C++ Cygwin 数字常量构建错误

python - Python 类中的作用域

C++ 控制内存访问和指针取消引用

sql - abap DF16_DEC数据类型对应的sql数据类型是什么?

c++ - 使用 pow 会产生意想不到的结果

c++ - 将流打印到自身的目的是什么?

MySQL:AVG 函数:为什么查询返回不正确的值?

C:返回行中的 OR 运算符?

c# - 如何在 C# 中创建关键字/类型?