You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:30:57