void foo (const std::string &s) {}
int main() {
foo(0); //compiles, but invariably causes runtime error
return 0;
}
El compilador (g ++ 4.4) aparentemente interpreta 0
como char* NULL
, y construye s
llamando string::string(const char*, const Allocator &a = Allocator())
. Lo cual es, por supuesto, inútil, porque el puntero NULL
no es un puntero válido para una cadena de caracteres. Esta mala interpretación no se produce cuando intento llamar al foo(1)
, esto produce un error en tiempo de compilación.¿Cómo evito que los problemas derivados de std :: string se construyan a partir de `0`?
¿Hay alguna posibilidad de conseguir un error o advertencia como en tiempo de compilación cuando accidentalmente llama a una función como
void bar(const std::string &s, int i=1);
con bar(0)
, olvidándose de la string
, y en realidad lo que significa tener i=0
?
No sin una cierta ayuda del compilador. Algunas implementaciones han agregado un 'basic_string (int)' privado para detectar este caso. Si no, supongo que no tienes suerte. –
Me sorprende que este pase gcc, es conocido por sus feos errores/advertencias, pero esperaba algo aquí. ¿Has subido el nivel de advertencia? –
@Matthieu No pude encontrar ninguna opción que me diera una advertencia, pero no me gustan las opciones de advertencia de gcc. '-W -Wall -Wpointer-arith -Wcast-qual' no funciona, en cualquier caso. – leftaroundabout