He estado jugando con la std::string_view
biblioteca y he estado pensando en cambiar una base de código en la que he estado trabajando para usar std::string_view
tanto como sea posible. Sin embargo, en muchos de los hilos que he leído sobre el tema de cuándo y dónde usar en std::string_view
lugar de const std::string &
. He visto muchas respuestas que dicen: "Cuando no necesita una cadena terminada en nulo". Entonces, cuando comencé a buscar en la web, "¿cuándo necesita una cadena terminada en nulo?" Realmente no he encontrado ninguna respuesta útil sobre el tema.
Se me ocurre un ejemplo de una biblioteca externa a la que vinculará que requiere a std::string
. Y en ese caso, necesitaría una cadena terminada en nulo ya que esa biblioteca lo requiere. Supongo que otro ejemplo sería si necesita modificar la cadena en sí, pero luego no la pasaríamos const &
si necesitáramos modificarla.
Entonces, ¿cuándo necesitaría usar una cadena terminada en nulo?
Enlaces que he mirado:
fuente
const char*
argumento. La respuesta de eerorika tiene un ejemplo.Respuestas:
Necesita una cadena terminada nula cada vez que la API que utiliza dice que la necesita. Este requisito es omnipresente en las interfaces C y no se establece explícitamente en alguna documentación. Si un argumento de función es un
char*
(posiblemente const), y no hay un argumento de longitud, debe asumir el requisito a menos que la documentación indique lo contrario.Tomemos la función
execve
(del estándar POSIX) como ejemplo:Si pasa un argumento terminado no nulo como
pathname
, entonces el comportamiento de su programa será indefinido.fuente
std::string
, ¿se ejecutaría comoexecve(pathname.c_str(),...,...)
?En realidad es bastante fácil de saber. Si está llamando a una función que solo toma una cadena c (
char*
/const char*
), entonces necesita una cadena terminada en nulo, ya que esa es la única manera de saber dónde está el final de la cadena.Si, en cambio, tiene una función que toma un
char*
/const char*
más el tamaño, o solo dos punteros que marcan el comienzo y el final de los datos, entonces no necesita una cadena terminada en nulo ya que tiene / puede obtener el tamaño de la cadena sin iterar a un terminador nulo.fuente