std :: string + =运算符不能传递0作为参数

时间:2016-11-30 09:02:17

标签: c++ stdstring

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 ++上测试过,我得到了相同的结果。所以我相信我会错过标准定义的东西。它是什么?

2 个答案:

答案 0 :(得分:47)

问题是文字0是空指针常量。编译器不知道你的意思是:

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

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

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

workround(正如您所发现的)是将附加内容写为:

tmp += '\0';

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

答案 1 :(得分:11)

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