J'ai joué avec la std::string_view
bibliothèque et j'ai envisagé de changer une base de code sur laquelle je travaillais pour utiliser std::string_view
autant que possible. Cependant, dans de nombreux threads que j'ai lus sur le sujet de quand et où utiliser à la std::string_view
place de const std::string &
. J'ai vu de nombreuses réponses dire: «Lorsque vous n'avez pas besoin d'une chaîne terminée par un caractère nul». Alors, comme j'ai commencé à chercher sur le Web, "quand avez-vous besoin d'une chaîne terminée par un caractère nul?" Je n'ai pas vraiment trouvé de réponses utiles sur le sujet.
Je peux penser à un exemple de bibliothèque externe que vous lierez à qui nécessite un std::string
. Et dans ce cas, vous auriez besoin d'une chaîne terminée par null puisque cette bibliothèque l'exige. Je suppose qu'un autre exemple serait si vous devez modifier la chaîne elle-même, mais nous ne la passerions pas const &
si nous avions besoin de la modifier.
Alors, quand auriez-vous besoin d'utiliser une chaîne terminée par null?
Liens que j'ai consultés:
la source
const char*
argument. La réponse de eerorika a un exemple.Réponses:
Vous avez besoin d'une chaîne terminée par un caractère nul chaque fois que l'API que vous utilisez indique que vous en avez besoin. Cette exigence est omniprésente dans les interfaces C et n'est pas explicitement mentionnée dans certains documents. Si un argument de fonction est un
char*
(éventuellement à const) et qu'il n'y a pas d'argument de longueur, vous devez assumer l'exigence, sauf indication contraire de la documentation.Prenons la fonction
execve
(du standard POSIX) comme exemple:Si vous passez un argument terminé non nul comme
pathname
, alors le comportement de votre programme sera indéfini.la source
std::string
, serait exécuté commeexecve(pathname.c_str(),...,...)
?C'est en fait assez facile à savoir. Si vous appelez une fonction qui ne prend qu'une chaîne c (
char*
/const char*
), vous avez besoin d'une chaîne terminée par un caractère nul car c'est le seul moyen de savoir où se trouve la fin de la chaîne.Si vous avez à la place une fonction qui prend un
char*
/const char*
plus la taille, ou seulement deux pointeurs marquant le début et la fin des données, vous n'avez pas besoin d'une chaîne terminée par un caractère nul puisque vous avez / pouvez obtenir la taille de la chaîne sans itérer sur un terminateur nul.la source