我想用cout打印出一个函数指针,发现不行。
但在我将函数指针转换为 (void *) 后它就起作用了,printf 与 %p 也一样,例如
#include <iostream>
using namespace std;
int foo() {return 0;}
int main()
{
int (*pf)();
pf = foo;
cout << "cout << pf is " << pf << endl;
cout << "cout << (void *)pf is " << (void *)pf << endl;
printf("printf(\"%%p\", pf) is %p\n", pf);
return 0;
}
我用 g++ 编译它并得到如下结果:
cout cout printf("%p", pf) 是 0x100000b0c
那么cout对int(*)()类型做了什么呢?有人告诉我函数指针被视为 bool,是真的吗?
cout 对 type (void *) 有何作用?
提前致谢。
编辑:无论如何,我们可以通过将函数指针转换为 (void *) 并使用 cout 打印出来来观察函数指针的内容。
但它不适用于成员函数指针,并且编译器会抱怨非法转换。我知道成员函数指针是一个比简单指针更复杂的结构,但是我们如何观察成员函数指针的内容呢?
实际上,
ostream & operator <<( ostream &, const void * );
这符合您的预期 - 以十六进制输出。函数指针不可能有这样的标准库重载,因为它们的类型有无限多种。因此,指针被转换为另一种类型,在本例中似乎是一个布尔类型 - 我无法立即记住此规则。
Edit:C++ 标准规定:
4.12 布尔转换
1 算术右值,
枚举、指针或指向的指针
成员类型可以转换为
bool 类型的右值。
这是为函数指针指定的唯一转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)