Сергей Терпеливый Asked:2020-05-14 15:05:35 +0800 CST2020-05-14 15:05:35 +0800 CST 2020-05-14 15:05:35 +0800 CST 函数指针大小 772 让有一个平庸的代码: void foo(){} int main(){ std::cout << foo; } 控制台输出: 1.我不明白为什么会这样,因为foo这种情况下,函数应该输出地址,肯定不等于1。 c++ 2 个回答 Voted Best Answer user7860670 2020-05-14T15:21:13+08:002020-05-14T15:21:13+08:00 没有运算符重载<<来打印函数的地址。但是 output 有过载bool。因此,函数的地址被隐式转换为bool. 您可以通过将函数指针显式转换为指向(仅打印地址值的void运算符重载)的指针来输出地址值:<< std::cout << reinterpret_cast<void *>(&foo); Xintrea 2022-07-18T21:13:02+08:002022-07-18T21:13:02+08:00 @user7860670 同志可能是错的。显然,“不存在用于显示函数地址的运算符重载 <<”这句话是不正确的。说 << 运算符没有重载以输出函数指针是正确的。但是没有这种重载,因为函数可以有一个完全任意的原型(不同数量和类型的参数,不同类型的返回值),因此指向函数的指针的类型可以是完全任意的. 接下来,您需要了解为什么将函数指针转换为 bool,而不是 const void* 或 unsigned long 或其他任何东西。 到目前为止,我的假设是转换为 bool 是因为它是一个指针(无论如何),并且自动指针类型解析适用于 bool 因为它是 std::basic_ostream 类定义中 C++ 标准中的第一个匹配原型。: // 29.7.5.1 Class template basic_ostream [ostream] namespace std { template<class charT, class traits = char_traits<charT>> class basic_ostream : virtual public basic_ios<charT, traits> { public: ... // 29.7.5.2, formatted output basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& (*pf)(basic_ostream<charT, traits>&)); basic_ostream<charT, traits>& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT, traits>&)); basic_ostream<charT, traits>& operator<<(ios_base& (*pf)(ios_base&)); basic_ostream<charT, traits>& operator<<(bool n); basic_ostream<charT, traits>& operator<<(short n); basic_ostream<charT, traits>& operator<<(unsigned short n); basic_ostream<charT, traits>& operator<<(int n); basic_ostream<charT, traits>& operator<<(unsigned int n); basic_ostream<charT, traits>& operator<<(long n); basic_ostream<charT, traits>& operator<<(unsigned long n); basic_ostream<charT, traits>& operator<<(long long n); basic_ostream<charT, traits>& operator<<(unsigned long long n); basic_ostream<charT, traits>& operator<<(float f); basic_ostream<charT, traits>& operator<<(double f); basic_ostream<charT, traits>& operator<<(long double f); 我可能是错的,也许会有更好的答案。
没有运算符重载
<<
来打印函数的地址。但是 output 有过载bool
。因此,函数的地址被隐式转换为bool
. 您可以通过将函数指针显式转换为指向(仅打印地址值的void
运算符重载)的指针来输出地址值:<<
@user7860670 同志可能是错的。显然,“不存在用于显示函数地址的运算符重载 <<”这句话是不正确的。说 << 运算符没有重载以输出函数指针是正确的。但是没有这种重载,因为函数可以有一个完全任意的原型(不同数量和类型的参数,不同类型的返回值),因此指向函数的指针的类型可以是完全任意的.
接下来,您需要了解为什么将函数指针转换为 bool,而不是 const void* 或 unsigned long 或其他任何东西。
到目前为止,我的假设是转换为 bool 是因为它是一个指针(无论如何),并且自动指针类型解析适用于 bool 因为它是 std::basic_ostream 类定义中 C++ 标准中的第一个匹配原型。:
我可能是错的,也许会有更好的答案。