3

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

另外,当我尝试时foo += 0,我得到一个编译错误,说 += 运算符与字符串和 int 的模棱两可的重载。为什么我在添加非零数字时没有收到编译错误,但我确实收到了零错误?

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

4

2 回答 2

3

它是 ASCII 十六进制值 0x27 还是 0x1b 的字符?

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

当您附加 0 时,编译器无法区分两种重载,一个附加一个字符,另一个附加一个指向字符的指针。附加 int 的重载将是最佳匹配,但未在 basic_string 模板中声明。

于 2018-02-18T03:50:18.173 回答
2

当我写到编译器将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'. 第一个是未定义的行为并且没有逻辑意义,但编译器不会猜测您一定是用另一种方式表示它。

于 2018-02-18T04:05:19.103 回答