如果我有一个字符串string foo
并且我写了foo += 27
,那么什么会附加到字符串中?是ASCII十六进制值0x27还是0x1b?
此外,当我尝试foo += 0
时,我得到一个编译错误,说明带有字符串和int的+ =运算符的模糊重载。为什么我没有添加非零数字的编译错误,但我确实得到一个零错误?
如果我先说int z = 0
然后foo += z
,我就不会收到错误消息。造成差异的原因是什么?
答案 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
。但是,由于char
和int
之间的隐式转换,并且因为没有更具体的std::basic_string<T>::operator+(int)
,编译器最终会将27
转换为'\x1b'
C ++最初使用0
作为空指针的关键字,因此foo + 0
可能意味着foo + static_cast<const char*>(0)
(更简洁,foo + nullptr
)或foo + '\0'
。第一个是未定义的行为,没有逻辑意义,但编译器不会猜测你必须以另一种方式表示它。