为何空字符串字面量+字符报错,string对象+=字符却正常?
为什么空字符串字面量+字符会报错,而string对象+=字符正常?
直接拆解三个案例的底层逻辑:
案例1:str += c 合法的原因
这里的str是std::string对象,std::string类已经重载了operator+=运算符,专门支持接收char类型参数——它会把传入的字符追加到字符串末尾,这是C++标准库提供的标准操作,完全符合语法规则,所以能正常运行。
案例3:"" + c 报错的原因
你可能误以为""是std::string对象,但实际上它是C风格的字符串字面量,类型是const char*(指向常量字符的指针)。当你把它和char类型的c相加时,c会被自动提升为int类型,这时候就变成了指针和整数的加法运算:相当于把空字符串的首地址往后偏移c的ASCII值个字节,得到一个非法的内存地址(空字符串只有末尾的'\0',偏移后指向的是未分配或无意义的内存)。
之后试图用这个非法指针构造std::string,自然会触发错误——要么是内存访问违规,要么是构造函数无法解析无效的C风格字符串。
案例2:string(1, c) 合法的原因
这是直接调用std::string的构造函数,该构造函数签名为std::string(size_t count, char ch),作用是生成一个包含count个ch字符的字符串,属于标准库提供的合法初始化方式,所以没问题。
总结
- 只有std::string对象的运算符才会帮你处理字符转字符串的逻辑;
- C风格字符串字面量是指针,和字符相加只会做指针偏移,不是字符串拼接。
内容的提问来源于stack exchange,提问作者paperba1l
相关产品推荐
相关产品推荐

