Considérons la citation suivante de la norme C++ 11 (the N3376 draft, pour être précis):Littéraux de chaîne définis par l'utilisateur Vs. Autres littéraux définis par l'utilisateur
(2.14.8.5)
Si L est un utilisateur de fi ned- string-literal, soit str le littéral sans son ud-su ffi x et soit len le nombre d'unités de code dans str (ie, sa longueur à l'exclusion du caractère nul final). Le L littéral est traité comme un appel de la forme
operator "" X (str , len)
considérant que, pour tous les autres types de littéraux définis par l'utilisateur (à virgule flottante, entier, caractère) la longueur est jamais passé le long, même si le littéral lui-même est passé comme une chaîne. Par exemple:
42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2)
Pourquoi existe-t-il cette distinction entre les littéraux définis par l'utilisateur avec et sans chaîne? Ou devrais-je dire, pourquoi l'implémentation passe-t-elle len pour les littéraux UD? La longueur, comme dans le cas d'autres littéraux, pourrait être déduite par null-termination. Qu'est-ce que je rate?
Probablement quelque chose à voir avec les encodages/jeux de caractères. Les autres paragraphes avant celui-ci ont tous "[Note: La séquence c1c2 ... ck ne peut contenir que des caractères du jeu de caractères source de base - note de fin]". – Mat
@Mat: Mais les chaînes avec d'autres encodages ou jeux de caractères sont toujours à terminaison nulle, n'est-ce pas? –
La terminaison nulle n'est pas suffisante. Je suppose que le "jeu de caractères source de base" n'inclut pas '\ 0'. – Mat