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

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

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

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

要么

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

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

workround(正如你所发现的)是把append写为:

 tmp += '\0'; 

(我假设你不想要string版本 – tmp += nullptr;在运行时会是UB)。

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