std::to_string 是最简方式,但它只支持 int、long、long long、unsigned 系列、float、double、long double 这几种基本数值类型。不支持 short、char、bool(会转成 0/1,但语义易混淆),也不支持自定义类型或 std::int128_t 等扩展整型。
常见错误现象:
std::to_string('a'); // 编译通过,但结果是 "97"(ASCII 值)
std::to_string(true); // 编译通过,结果是 "1"这不是预期的字符或布尔字符串表示,容易引发逻辑 bug。
char 用 std::string(1, c) 更安全bool 显式写 b ? "true" : "false"
short 先转 int: std::to_string(static_cast(s))
std::to_string 对浮点数调用的是默认格式化(类似 %f),固定输出 6 位小数,且末尾零不省略。例如 std::to_string(3.14) 得到 "3.140000",std::to_string(1e5) 得到 "100000.000000",既冗余又不符合显示需求。
std::ostringstream + std::setprecision / std::fixed
std::scientific
f 或 e 格式?std::defaultfloat(C++11 起)std::ostringstream oss;
oss << std::fixed << std::setprecision(2) << 3.14159;
std::string s = oss.str(); // "3.14"
部分老版本 GCC(如 4.6 及更早)、MSVC 2010 或裸机环境(如没有完整 STL 的 freestanding 实现)中,std::to_string 可能未实现或行为异常。链接时可能报 undefined reference to 'std::to_string'。
-std=c++11 或更高std::ostringstream(兼容性最好)sprintf + std::string 构造(需注意缓冲区大小)char buf[32];
sprintf(buf, "%d", 42);
std::string s(buf); // 不推荐用于浮点或大数
std::to_string 内部仍依赖 std::ostringstream 或底层格式化函数,有堆分配和 locale 查找开销。高频调用(如日志循环、游戏帧更新)中,它比手写整数转字符串(如除 10 取余)慢 2–5 倍。
to_string,考虑预格式化缓存或二进制序列化to_string 有部分优化,但
别依赖真正要兼顾简洁、安全和跨平台,std::ostringstream 虽啰嗦一点,反而最稳——尤其当你忘了 to_string 不支持 long long 在某些旧 libstdc++ 版本里会静默失败的时候。