c++ - studio - std:: string+= el operador no puede pasar 0 como argumento
visual studio installer (2)
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?
El primero argumenta que pasar entero como argumento, ¿verdad? ¿Por qué otros pasan la compilación? Probé en Visual C ++ y en g ++, y obtuve el mismo resultado anterior. Entonces creo que echo de menos algo definido por estándar. ¿Qué es?
El literal 0
es implícitamente convertible a todos los tipos de puntero (lo que da como resultado sus respectivas constantes de puntero nulo). Por lo tanto, da como resultado dos secuencias de conversión igualmente válidas para hacer coincidir el operador anexo de std::string
.
El problema es que un literal 0 es una constante de puntero nulo . El compilador no sabe si se refería a:
std::string::operator +=(const char*); // tmp += "abc";
o
std::string::operator +=(char); // tmp += ''a'';
(mejores compiladores enumeran las opciones).
El workround (como has descubierto) es escribir el apéndice como:
tmp += ''/0'';
(Supongo que no quería que la versión de cadena tmp += nullptr;
sería UB en tiempo de ejecución).