C++中std::runtime_error抛出异常内容缺失原因咨询
为什么两种throw语句的异常信息表现不同?
咱们先拆解第一个出问题的语句:
throw std::runtime_error("abcdefghijklmnopqrstuvq"+12);
这里的 "abcdefghijklmnopqrstuvq" 是一个C风格字符串字面量,它在C++中的类型是 const char*。当你对一个指针做加法操作(比如+12),这本质是指针算术运算:指针会向前偏移12个char的长度。
咱们数一下原字符串的字符索引:
- a是索引0,b是1,……,l是11,m是12
所以偏移12个字符后,指针直接指向了原字符串中第13个字符(m)的位置,std::runtime_error接收这个指针后,就从m开始读取字符串,最终输出的异常信息自然就是mnopqrstuvq了。
再看第二个正常的语句:
throw std::runtime_error("abcdefghijklmnopqrstuvq"+std::to_string(12));
这里的 std::to_string(12) 返回的是一个 std::string 对象。当你把C风格字符串字面量和 std::string 做加法时,C++会先把字面量隐式转换为 std::string,然后执行字符串拼接操作,最终得到的是原字符串加上"12"的完整新字符串,所以异常信息会正常显示拼接后的内容。
简单总结:
- 第一种是指针偏移,不是字符串拼接
- 第二种是真正的字符串拼接,因为涉及到
std::string的重载运算符
内容的提问来源于stack exchange,提问作者Vinodini Natrajan
相关产品推荐
相关产品推荐

