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

std::string += operator cannot pass 0 as argument

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 += '[=11=]';//ok...expected
tmp +=INT_MAX;//ok
tmp +=int(INT_MAX);//still ok...what?

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

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

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

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

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

解决方法(如您所见)是将追加写为:

tmp += '[=12=]';

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

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