基于范围的for循环遍历临时字符串时为何出现额外空字符?
核心原因
你存在一个认知偏差:第一段代码中范围for遍历的对象不是临时std::string,而是C风格字符串字面量"bar",它的原生类型是const char[4],本身就包含3个可见字符+末尾的\0空终止符,总长度为4。
范围for循环遍历原生数组时,会自动匹配数组的完整长度,遍历所有元素,因此会把末尾的\0也纳入遍历范围,写入到map中。
而第二段代码遍历的是std::string对象,std::string的迭代器范围[begin(), end())仅包含字符串的有效可见字符,不包含末尾隐式存储的空终止符,因此遍历不会出现\0。
如果要验证临时std::string的遍历行为,可以将第一段代码的循环修改为:
for (char c : std::string{"bar"}) m[c] = 0;
此时遍历的才是临时std::string,输出结果会和第二段代码完全一致,不会出现空字符。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

