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

b1uwtaje  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(113)

下面的代码输出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;
}

字符串

bwitn5fc

bwitn5fc1#

函数指针不能转换为数据指针。如果你试图将一个值赋给一个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++标准的Angular 来看)。除了强制转换回相同的函数指针之外,将其用于其他任何事情都会产生特定于实现的结果,这在编译器中非常重要。

n9vozmp4

n9vozmp42#

使用的重载为

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

字符串
1打印为函数指针的函数不为null。

相关问题