为什么在c++中函数指针地址以bool类型打印

Why function pointer address is printing in bool type in c++?

本文关键字:bool 类型 打印 地址 指针 c++ 函数 为什么      更新时间:2023-10-16

下面的代码输出1,但我希望它输出函数add的地址。出了什么问题?

#include <iostream>
int add(int x, int y) { return x + y; }
int main()
{
    int (*func_ptr)(int,int) = add;
    std::cout << "The address of function add() is: " << func_ptr << std::endl;
}

函数指针不能转换为数据指针。你会得到一个编译器错误,如果你试图分配一个void*变量。但是它们可以隐式地转换为bool !

这就是为什么选择operator<<bool过载而不是const void*过载的原因。

要强制你想要的重载,你需要使用一个非常强的c++强制类型转换,这将使几乎完全忽略静态类型信息。

#include <iostream>
int add(int x, int y) { return x + y; }
int main()
{
    int (*func_ptr)(int,int) = add;
    std::cout << "The address of function add() is: "
              << reinterpret_cast<void*>(func_ptr)
              << std::endl;
}

参见编译器资源管理器

请注意,仅有条件地支持将函数指针转换和处理为数据指针(从c++标准的角度来看)。将它用于除强制转换回同一函数指针以外的任何操作都将产生特定于实现的结果,这在编译器之间可能非常大。

使用的重载是

ostream& ostream::operator<< (bool val);

打印1作为你的函数指针不是空的