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

我使用的是哪个std::string构造函数?是否存在未定义行为?

std::string构造函数相关问题解答

构造函数确认

你猜的完全正确,string str(s);调用的就是接收const char*的构造函数(也就是你提到的第4个),它会把传入的以空字符\0结尾的C风格字符串完整复制到std::string对象里。

调试器显示的误区

C语言标准明确规定,像"abc"这样的字符串字面量,编译器会自动在末尾追加一个\0作为结束标志。你在Qt Creator调试器里看不到这个空字符,只是调试器的显示逻辑导致的——大多数调试器在展示C字符串时,默认只显示到第一个\0之前的内容,不会把末尾的空字符可视化出来,并不是它真的不存在。

你可以直接通过代码验证:比如打印(int)s[3],结果应该是0(也就是'\0'的ASCII值),所以你的代码完全符合标准,没有进入未定义行为的范畴。

是否需要改用带长度的构造函数

完全没必要。string str(s);的写法是标准、安全且可读性更好的,只要s指向的是合法的以\0结尾的C字符串(比如你代码里的字符串字面量),就不会有任何问题。

只有两种场景需要用string str(s, 3);这种带长度的构造函数:

  • 你要复制的字符序列没有空字符结尾(比如某些二进制数据片段)
  • 你明确只想复制前N个字符,不管后面有没有空字符

内容的提问来源于stack exchange,提问作者KcFnMi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:19