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::string
s 追加运算符。
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::string
s 追加运算符。