将int添加到字符串c ++中

时间:2018-02-18 03:42:36

标签: c++ numerics

如果我有一个字符串string foo并且我写了foo += 27,那么什么会附加到字符串中?是ASCII十六进制值0x27还是0x1b?

的字符

此外,当我尝试foo += 0时,我得到一个编译错误,说明带有字符串和int的+ =运算符的模糊重载。为什么我没有添加非零数字的编译错误,但我确实得到一个零错误?

如果我先说int z = 0然后foo += z,我就不会收到错误消息。造成差异的原因是什么?

2 个答案:

答案 0 :(得分:3)

  

是ASCII十六进制值0x27还是0x1b?

的字符

由于你没有写foo += 0x27,显然它是0x1b。

当你追加0时,编译器无法区分两个重载,一个附加一个char,另一个附加一个指向char的指针。附加int的重载将是最佳匹配,但它不在basic_string模板中声明。

答案 1 :(得分:2)

当我写这篇文章时,编译器将foo + 27视为与foo + '\033'foo + '\x1b'相同,我最初错了。 (其中任何一种都是编写表达式的更好方法。)字符常量的类型在C中为int,但在C ++中为char。但是,由于charint之间的隐式转换,并且因为没有更具体的std::basic_string<T>::operator+(int),编译器最终会将27转换为'\x1b'

C ++最初使用0作为空指针的关键字,因此foo + 0可能意味着foo + static_cast<const char*>(0)(更简洁,foo + nullptr)或foo + '\0'。第一个是未定义的行为,没有逻辑意义,但编译器不会猜测你必须以另一种方式表示它。