【问题标题】:Adding an int to a string c++将int添加到字符串c ++
【发布时间】:2018-02-18 03:42:35
【问题描述】:

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

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

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

【问题讨论】:

  • 0 曾经是nullptr 的表达方式。仍然会导致混淆您是指值还是指针。

标签: c++ numerics


【解决方案1】:

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

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

当您附加 0 时,编译器无法区分两种重载,一个附加一个字符,另一个附加一个指向字符的指针。附加 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'。第一个是未定义的行为,没有逻辑意义,但编译器不会猜到您一定是反其道而行之。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多