将一个整数添加到字符串中 c++

3
如果我有一个字符串string foo并且我写foo += 27,那么会将什么追加到字符串中?是ASCII十六进制值为0x27的字符还是0x1b的字符?
另外,当我尝试foo += 0时,我会收到编译错误,说是模糊的+=运算符重载,其中包括字符串和整数。为什么我在添加非零数字时不会收到编译错误,但是在添加零时却会收到错误?
如果我首先说int z = 0然后foo += z,我就不会收到错误。这是什么原因引起的差异?

2
0 曾经是表示 nullptr 的方式。这仍然会导致混淆,不知道你是指一个值还是一个指针。 - Bo Persson
2个回答

3

这个字符是ASCII十六进制值为0x27还是0x1b?

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

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


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'。第一个在逻辑上没有任何意义且未定义行为,但编译器不会猜测你的意图并将其解释为后者。


2
在C++中,字符字面量的类型是char而不是int(请查看生成函数的解缠名称); 隐式转换(双向转换)意味着与C几乎没有向后不兼容性。 - Daniel H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接