如果我有一个字符串string foo
并且我写foo += 27
了,那么字符串会附加什么?它是 ASCII 十六进制值 0x27 还是 0x1b 的字符?
另外,当我尝试时foo += 0
,我得到一个编译错误,说 += 运算符与字符串和 int 的模棱两可的重载。为什么我在添加非零数字时没有收到编译错误,但我确实收到了零错误?
如果我先说int z = 0
然后foo += z
,我不会收到错误消息。造成差异的原因是什么?
它是 ASCII 十六进制值 0x27 还是 0x1b 的字符?
既然你没有写foo += 0x27
,显然它是 0x1b。
当您附加 0 时,编译器无法区分两种重载,一个附加一个字符,另一个附加一个指向字符的指针。附加 int 的重载将是最佳匹配,但未在 basic_string 模板中声明。
当我写到编译器将foo + 27
其视为与foo + '\033'
or相同时,我最初犯了错误foo + '\x1b'
。(其中任何一个都是编写表达式的更好方法。)字符常量的类型int
在 C 中,但char
在 C++ 中。char
但是,由于and之间的隐式转换int
,并且没有更具体std::basic_string<T>::operator+(int)
的 ,编译器最终还是转换27
为 to '\x1b'
。
C++ 最初用作0
空指针的关键字,因此foo + 0
可以表示foo + static_cast<const char*>(0)
(更简洁地说,foo + nullptr
)或foo + '\0'
. 第一个是未定义的行为并且没有逻辑意义,但编译器不会猜测您一定是用另一种方式表示它。