为何`cout << str`与`cout << &str`输出1而非函数地址?
为何输出
str与&str得到的是1而非函数地址? 已知std::string str(std::istreambuf_iterator<char>(t),std::istreambuf_iterator<char>())是普通函数声明,运行以下代码时,cout << str与cout << &str的输出却是1而非预期的函数地址(如0x4591),这是为什么?
代码片段:
#include <string> #include <fstream> #include <streambuf> #include <iostream> std::string str(std::istreambuf_iterator<char>(t), std::istreambuf_iterator<char>()){ return {}; }; int main() { std::cout << str << std::endl; std::cout << &str << std::endl; }
原因解析
这是因为C++中函数指针可以隐式转换为bool类型:
- 对于
cout << str:函数名str会自动退化为指向该函数的指针,而非空的函数指针会被隐式转换为布尔值true,std::cout输出true时默认打印1。 - 对于
cout << &str:&str直接获取函数地址,得到的非空函数指针同样会被隐式转换为true,最终输出1。
如何输出函数地址
如果想要打印函数的实际地址,需要将函数指针显式转换为void*类型——标准库没有为函数指针重载operator<<,但对void*有对应的重载:
std::cout << (void*)str << std::endl; std::cout << (void*)&str << std::endl;
这样就能输出类似0x4591的函数地址了。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

