2008-10-26 21 views
6

Un answer to one of my questions incluye la siguiente línea de código:¿Qué es std :: safe_string?

label = std::safe_string(name); // label is a std::string 

La intención parece ser una envoltura alrededor de una cadena literal (por lo que presumiblemente no se lleva a cabo la asignación). Nunca he oído hablar de safe_string y aparentemente ninguno de ellos tiene google (ni pude encontrarlo en el estándar 98).

¿Alguien sabe de qué se trata esto?

Respuesta

8

Después de buscar google code search (debería haber pensado en esta primera ...) encontré esto:

//tools-cgi.cpp 
string safe_string (const char * s) 
{ 
    return (s != NULL) ? s : ""; 
} 

que convierte NULL s de cadenas de longitud cero. Aunque esto no es estándar, es probable que sea una especie de extensión en una implementación específica de STL a la que se hizo referencia en la respuesta.

5

No hay tal cosa como std::safe_string

6

No hay safe_string estándar. La cadena de seguridad que está viendo en la respuesta de esa respuesta proviene de lo que parece una biblioteca de utilidades de extensiones STL privadas.

Google for "stlext/stringext.h" y verá la misma biblioteca a la que se hace referencia en una publicación en otro foro.

+0

Los resultados de su búsqueda no incluyen "safe_string". – Motti

0

No es parte del estándar de C++ (pero quizás que debería ser?)

He estado usando el mismo tipo de función auxiliar para evitar un std :: string una excepción con un * cadena NULL carbón. Pero era más algo como:

// defined somewhere else as "" 
extern const char * const g_strEmptyString ; 

inline const char * safe_string(const char * p) 
{ 
    return (p) ? (p) : (g_strEmptyString) ; 
} 

Sin gastos generales, y ningún accidente de un std :: string cuando me alimento que una cadena char * que podría ser NULL, pero que, en ese caso particular, debe comportarse como una cuerda vacía.

+0

¿Por qué necesita g_strEmptyString, no "" hace el truco. – Motti

+0

El uso de "" crea un objeto literal de 1 byte. Si el compilador no es inteligente, cada uno es diferente y, por lo tanto, podría inflar el código. Sospecho que el compilador es lo suficientemente inteligente como para optimizar esto y, por lo tanto, se trata de una ganancia falsa y complica el código. –

+1

No me incomoda la idea de devolver punteros o referencias a objetos locales, incluso si se supone que el compilador maneja cada caso correctamente (y hace que "sobreviva a la devolución"). – paercebal

Cuestiones relacionadas