metodos - string c++ library
¿Asignar un nullptr a un std:: string es seguro? (3)
Mi pregunta es si GetValue () devuelve NULL myString se convierte en una cadena vacía. ¿Está indefinido? ¿O se segfault?
Es un comportamiento indefinido. El compilador y el tiempo de ejecución pueden hacer lo que quieran y seguir siendo compatibles.
Estaba trabajando en un pequeño proyecto y llegué a una situación en la que sucedió lo siguiente:
std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
Mi pregunta es si GetValue()
devuelve NULL myString
convierte en una cadena vacía. ¿Está indefinido? ¿O se segfault?
Es un error de ejecución.
Usted debe hacer esto:
myString = ValueOrEmpty(myObject.GetValue());
donde ValueOrEmpty
se define como:
std::string ValueOrEmpty(const char* s)
{
return s == nullptr ? std::string() : s;
}
O podrías devolver const char*
(tiene mejor sentido):
const char* ValueOrEmpty(const char* s)
{
return s == nullptr ? "" : s;
}
Si devuelve const char*
, entonces en el sitio de la llamada, se convertirá en std::string
.
Pequeña pregunta interesante. Según la norma C ++ 11, sec. 21.4.2.9,
basic_string(const charT* s, const Allocator& a = Allocator());
Requiere: s no será un puntero nulo.
Dado que el estándar no le pide a la biblioteca que lance una excepción cuando no se cumple este requisito en particular, parece que pasar un puntero nulo provocó un comportamiento indefinido.