Venho brincando com a std::string_view
biblioteca e estou pensando em mudar uma base de código em que tenho trabalhado para usar std::string_view
o máximo possível. No entanto, em muitos dos tópicos que li sobre o assunto de quando e onde usar em std::string_view
vez de const std::string &
. Eu já vi muitas respostas dizerem: "Quando você não precisa de uma sequência terminada nula". Então, quando comecei a pesquisar na web, "quando você precisa de uma string terminada nula?" Eu realmente não encontrei nenhuma resposta útil sobre o assunto.
Posso pensar em um exemplo de uma biblioteca externa à qual você vinculará que requer a std::string
. E, nesse caso, você precisaria de uma sequência terminada nula, pois essa biblioteca exige. Eu acho que outro exemplo seria se você precisasse modificar a string em si, mas não passaríamos const &
se precisássemos modificá-la.
Então, quando você precisaria usar uma string terminada nula?
Links que eu procurei:
fonte
const char*
argumento. a resposta de eerorika tem um exemplo.Respostas:
Você precisa de uma sequência terminada nula sempre que a API usada indicar que você precisa. Esse requisito é onipresente nas interfaces C e não é explicitamente declarado em alguma documentação. Se um argumento de função é um
char*
(possivelmente const) e não existe um argumento de comprimento, você deve assumir o requisito, a menos que a documentação diga o contrário.Vamos pegar a função
execve
(do padrão POSIX) como um exemplo:Se você passar um argumento terminado não nulo como
pathname
, o comportamento do seu programa será indefinido.fonte
std::string
, seria executado comoexecve(pathname.c_str(),...,...)
?É realmente muito fácil de saber. Se você estiver chamando uma função que usa apenas uma string c (
char*
/const char*
), precisará de uma string terminada nula, pois essa é a única maneira de saber onde fica o final da string.Se você possui uma função que ocupa um
char*
/const char*
mais o tamanho, ou apenas dois ponteiros marcam o início e o fim dos dados, não precisa de uma sequência terminada nula, pois possui / pode obter o tamanho da sequência sem iterar para um terminador nulo.fonte