【问题标题】:std::string += operator cannot pass 0 as argumentstd::string += 运算符不能将 0 作为参数传递
【发布时间】:2017-04-14 12:32:50
【问题描述】:
std::string tmp;
tmp +=0;//compile error:ambiguous overload for 'operator+=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'int')
tmp +=1;//ok
tmp += '\0';//ok...expected
tmp +=INT_MAX;//ok
tmp +=int(INT_MAX);//still ok...what?

第一个认为传递整数作为参数,对吗?为什么其他人通过编译?我在Visual C++和g++上测试过,我得到了与上面相同的结果。所以我相信我错过了标准定义的东西。这是什么?

【问题讨论】:

  • int 将转换为char。但是对于0,很难说是NULL 还是int 0

标签: c++ stdstring


【解决方案1】:

问题在于文字 0 是一个 空指针常量。编译器不知道您的意思是:

std::string::operator +=(const char*);  // tmp += "abc";

std::string::operator +=(char);         // tmp += 'a';

(更好的编译器会列出选项)。

解决方法(正如您所发现的)是将附加编写为:

tmp += '\0';

(我假设您不想要字符串版本 - tmp += nullptr; 在运行时会是 UB。)

【讨论】:

  • 编译器真的应该考虑+=(char)吗?
  • 是的。 char 是整数类型,整数可以隐式转换为 char。 +=(char) 是在所有非模棱两可的情况下被调用的重载。
【解决方案2】:

0 文字可隐式转换为所有指针类型(产生它们各自的空指针常量)。因此,它会产生两个同样有效的转换序列来匹配std::strings 附加运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2012-12-27
    • 2017-11-18
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多