Je l'ai toujours compris de cette manière : le but de la iostream
est de lire et/ou d'écrire un flux de caractères, qui, si l'on y réfléchit, sont des entités abstraites qui ne sont représentées par l'ordinateur qu'à l'aide d'un codage de caractères. La norme C++ se donne beaucoup de mal pour éviter de préciser le codage des caractères, indiquant seulement que "les objets déclarés comme des caractères ( char
) doit être suffisamment grand pour stocker n'importe quel membre du jeu de caractères de base de l'implémentation ", car elle n'a pas besoin de forcer le " jeu de caractères de base de l'implémentation " à définir le langage C++ ; la norme peut laisser la décision de dont est utilisé jusqu'à l'implémentation (compilateur avec une implémentation STL), et notez juste que char
représentent des caractères uniques dans un certain codage.
Le rédacteur d'une implémentation pourrait choisir un codage à un octet tel que ISO-8859-1 ou même un encodage double-octet tel que UCS-2 . Cela n'a pas d'importance. Tant qu'un char
est "suffisamment grand pour stocker n'importe quel membre du jeu de caractères de base de l'implémentation" (notez que cela interdit explicitement l'utilisation de l'objet codages à longueur variable ), alors l'implémentation peut même choisir un encodage qui représente le latin de base d'une manière incompatible avec tout encodage commun !
Il est déroutant que le char
, signed char
y unsigned char
partagent le terme "char" dans leur nom, mais il est important de garder à l'esprit que char
n'appartient pas à la même famille de types fondamentaux que signed char
y unsigned char
. signed char
est dans la famille des types d'entiers signés :
Il y a quatre types d'entiers signés : " signed char ", " short int ", " int " et " long int ".
et unsigned char
fait partie de la famille des types d'entiers non signés :
Pour chacun des types d'entiers signés, il existe un type d'entier correspondant (mais différent) type d'entier non signé : "unsigned char", "unsigned short int", "unsigned int" et "unsigned long int", ...
La seule similitude entre les char
, signed char
y unsigned char
est qu'"[ils] occupent la même quantité de stockage et ont les mêmes exigences d'alignement". Ainsi, on peut reinterpret_cast
de char *
à unsigned char *
afin de déterminer la valeur numérique d'un caractère dans le jeu de caractères d'exécution.
Pour répondre à votre question, la raison pour laquelle la STL utilise char
comme type par défaut est dû au fait que les flux standard sont destinés à lire et/ou écrire des flux de caractères, représentés par char
et non des entiers ( signed char
y unsigned char
). L'utilisation de char
par rapport à la valeur numérique est un moyen de séparer les préoccupations.