String literal
Table des matières |
Syntaxe
"
s-char-seq
(optionnel)
"
|
(1) | ||||||||
R"
d-char-seq
(optionnel)
(
r-char-seq
(optionnel)
)
d-char-seq
(optionnel)
"
|
(2) | (depuis C++11) | |||||||
L"
s-char-seq
(optionnel)
"
|
(3) | ||||||||
LR"
d-char-seq
(optionnel)
(
r-char-seq
(optionnel)
)
d-char-seq
(optionnel)
"
|
(4) | (depuis C++11) | |||||||
u8"
s-char-seq
(optionnel)
"
|
(5) | (depuis C++11) | |||||||
u8R"
d-char-seq
(optionnel)
(
r-char-seq
(optionnel)
)
d-char-seq
(optionnel)
"
|
(6) | (depuis C++11) | |||||||
u"
s-char-seq
(optionnel)
"
|
(7) | (depuis C++11) | |||||||
uR"
d-char-seq
(optionnel)
(
r-char-seq
(optionnel)
)
d-char-seq
(optionnel)
"
|
(8) | (depuis C++11) | |||||||
U"
s-char-seq
(optionnel)
"
|
(9) | (depuis C++11) | |||||||
UR"
d-char-seq
(optionnel)
(
r-char-seq
(optionnel)
)
d-char-seq
(optionnel)
"
|
(10) | (depuis C++11) | |||||||
Explication
| s-char-seq | - | Une séquence d'un ou plusieurs s-char s |
| s-char | - |
L'un des éléments suivants
|
| basic-s-char | - | Un caractère du jeu de caractères source de base (jusqu'en C++23) jeu de caractères de traduction (depuis C++23) , sauf le guillemet double " , la barre oblique inverse \ , ou le caractère de nouvelle ligne |
| d-char-seq | - | Une séquence d'un ou plusieurs d-char s, d'au plus 16 caractères |
| d-char | - | Un caractère du jeu de caractères source de base (jusqu'en C++23) jeu de caractères de base (depuis C++23) , sauf les parenthèses, la barre oblique inverse et les espaces |
| r-char-seq | - |
Une séquence d'un ou plusieurs
r-char
s, sauf qu'elle ne doit pas contenir la séquence de fermeture
)
d-char-seq
"
|
| r-char | - | Un caractère du jeu de caractères source de base (jusqu'en C++23) jeu de caractères de traduction (depuis C++23) |
| Syntaxe | Type | Type de données | Encodage | ||||
|---|---|---|---|---|---|---|---|
| (1,2) | littéral de chaîne ordinaire | const char [ N ] | encodage littéral ordinaire | ||||
| (3,4) | littéral de chaîne large | const wchar_t [ N ] | encodage littéral large | ||||
| (5,6) | littéral de chaîne UTF-8 |
|
UTF-8 | ||||
| (7,8) | littéral de chaîne UTF-16 | const char16_t [ N ] | UTF-16 | ||||
| (9,10) | littéral de chaîne UTF-32 | const char32_t [ N ] | UTF-32 |
Dans les types listés dans le tableau ci-dessus, N est le nombre d'unités de code encodées, qui est déterminé ci-dessous .
Les littéraux de chaîne ordinaires et UTF-8 (depuis C++11) sont collectivement appelés littéraux de chaîne étroite.
L'évaluation d'un littéral de chaîne résulte en un objet littéral de chaîne avec une durée de stockage statique. Le fait que tous les littéraux de chaîne soient stockés dans des objets non chevauchants et que des évaluations successives d'un littéral de chaîne produisent le même objet ou un objet différent n'est pas spécifié.
L'effet de tenter de modifier un objet littéral de chaîne est indéfini.
bool b = "bar" == 3 + "foobar"; // peut être vrai ou faux, non spécifié const char* pc = "Hello"; char* p = const_cast<char*>(pc); p[0] = 'M'; // comportement indéfini
Littéraux de chaîne bruts
Les littéraux de chaîne bruts sont des littéraux de chaîne avec un préfixe contenant
// OK: contains one backslash, // equivalent to "\\" R"(\)"; // OK: contains four \n pairs, // equivalent to "\\n\\n\\n\\n" R"(\n\n\n\n)"; // OK: contains one close-parenthesis, two double-quotes and one open-parenthesis, // equivalent to ")\"\"(" R"-()""()-"; // OK: equivalent to "\n)\\\na\"\"\n" R"a( )\ a"" )a"; // OK: equivalent to "x = \"\"\\y\"\"" R"(x = ""\y"")"; // R"<<(-_-)>>"; // Error: begin and end delimiters do not match // R"-()-"-()-"; // Error: )-" appears in the middle and terminates the literal |
(depuis C++11) |
Initialisation
Les objets littéraux de chaîne sont initialisés avec la séquence de valeurs d'unités de code correspondant à la séquence de s-char s et de r-char s (depuis C++11) , plus un caractère nul de terminaison (U+0000), dans l'ordre comme suit :
T
comme le type d'élément de tableau du littéral de chaîne (voir le tableau
ci-dessus
):
-
Si
v
n'excède pas la plage des valeurs représentables de
T, alors la séquence d'échappement contribue une unité de code unique avec la valeur v . -
Sinon, si
le littéral de chaîne est de syntaxe
(1)
ou
(3)
, et
(depuis C++11)
v
n'excède pas la plage des valeurs représentables du type non signé correspondant pour le type sous-jacent de
T, alors la séquence d'échappement contribue une unité de code unique avec une valeur unique de typeT, qui est congruente à v mod 2 S
, où S est la largeur deT. - Sinon, le programme est mal formé.
Concaténation
Les littéraux de chaîne adjacents sont concaténés lors de la phase de traduction 6 (après le préprocesseur) :
- Si les deux littéraux de chaîne sont du même type , le littéral de chaîne concaténé est également de ce type.
|
(jusqu'à C++11) | ||||
|
(depuis C++11) |
"Hello, " "world!" // à la phase 6, les 2 littéraux de chaîne forment "Hello, world!" L"Δx = %" PRId16 // à la phase 4, PRId16 se développe en "d" // à la phase 6, L"Δx = %" et "d" forment L"Δx = %d"
- ↑ Aucune implémentation connue ne prend en charge une telle concaténation.
Chaînes non évaluées
Les contextes suivants attendent un littéral de chaîne, mais ne l'évaluent pas :
- linkage de langage spécification
| (depuis C++11) | |
|
(depuis C++14) |
|
(depuis C++20) |
| (depuis C++26) |
|
Il n'est pas spécifié si les littéraux de chaîne non ordinaires sont autorisés dans ces contextes , sauf qu'un nom d'opérateur littéral doit utiliser un littéral de chaîne ordinaire (depuis C++11) . |
(jusqu'à C++26) |
|
Seuls les littéraux de chaîne ordinaires sont autorisés dans ces contextes. Chaque nom de caractère universel et chaque séquence d'échappement simple dans une chaîne non évaluée est remplacé par l'élément du jeu de caractères de traduction qu'il dénote. Une chaîne non évaluée qui contient une séquence d'échappement numérique ou une séquence d'échappement conditionnelle est mal formée. |
(depuis C++26) |
Notes
Les littéraux de chaîne peuvent être utilisés pour initialiser des tableaux de caractères . Si un tableau est initialisé comme char str [ ] = "foo" ; , str contiendra une copie de la chaîne "foo" .
|
Les littéraux de chaîne sont convertibles et assignables à des char * ou wchar_t * non constants pour assurer la compatibilité avec le C, où les littéraux de chaîne sont de types char [ N ] et wchar_t [ N ] . Une telle conversion implicite est dépréciée. |
(jusqu'à C++11) |
|
Les littéraux de chaîne ne sont pas convertibles ni assignables à des
|
(depuis C++11) |
Un littéral de chaîne n'est pas nécessairement une séquence de caractères terminée par un caractère nul : si un littéral de chaîne contient des caractères nuls intégrés, il représente un tableau qui contient plus d'une chaîne.
const char* p = "abc\0def"; // std::strlen(p) == 3, mais le tableau a une taille de 8
Si un chiffre hexadécimal valide suit une séquence d'échappement hexadécimale dans un littéral de chaîne, cela échouerait à compiler en tant que séquence d'échappement invalide. La concaténation de chaînes peut être utilisée comme solution de contournement :
//const char* p = "\xfff"; // erreur : séquence d'échappement hexadécimale hors plage const char* p = "\xff""f"; // OK : le littéral est const char[3] contenant {'\xff','f','\0'}
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_char8_t
|
202207L
|
(C++23)
(DR20) |
char8_t correctif de compatibilité et de portabilité (autorise l'initialisation de tableaux ( unsigned ) char à partir de littéraux de chaîne UTF-8) |
__cpp_raw_strings
|
200710L
|
(C++11) | Littéraux de chaîne bruts |
__cpp_unicode_literals
|
200710L
|
(C++11) | Littéraux de chaîne Unicode |
Exemple
#include <iostream> // array1 et array2 contiennent les mêmes valeurs : char array1[] = "Foo" "bar"; char array2[] = {'F', 'o', 'o', 'b', 'a', 'r', '\0'}; const char* s1 = R"foo( Hello World )foo"; // identique à const char* s2 = "\nHello\n World\n"; // identique à const char* s3 = "\n" "Hello\n" " World\n"; const wchar_t* s4 = L"ABC" L"DEF"; // OK, identique à const wchar_t* s5 = L"ABCDEF"; const char32_t* s6 = U"GHI" "JKL"; // OK, identique à const char32_t* s7 = U"GHIJKL"; const char16_t* s9 = "MN" u"OP" "QR"; // OK, identique à const char16_t* sA = u"MNOPQR"; // const auto* sB = u"Mixed" U"Types"; // avant C++23, peut être supporté ou non par // l'implémentation ; incorrect depuis C++23 const wchar_t* sC = LR"--(STUV)--"; // OK, littéral de chaîne brute int main() { std::cout << array1 << ' ' << array2 << '\n' << s1 << s2 << s3 << std::endl; std::wcout << s4 << ' ' << s5 << ' ' << sC << std::endl; }
Sortie :
Foobar Foobar Hello World Hello World Hello World ABCDEF ABCDEF STUV
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
|
CWG 411
( P2029R4 ) |
C++98 |
les séquences d'échappement dans les littéraux de chaîne
n'étaient pas autorisées à mapper vers plusieurs unités de code |
autorisé |
|
CWG 1656
( P2029R4 ) |
C++98 |
les caractères dénotés par les séquences d'échappement numériques
dans les littéraux de chaîne n'étaient pas clairs |
clarifié |
| CWG 1759 | C++11 |
un littéral de chaîne UTF-8 pourrait avoir des
unités de code qui ne sont pas représentables dans char |
char peut représenter toutes les unités de code UTF-8 |
| CWG 1823 | C++98 |
la distinction des littéraux de chaîne
était définie par l'implémentation |
la distinction n'est pas spécifiée, et le même
littéral de chaîne peut produire un objet différent |
|
CWG 2333
( P2029R4 ) |
C++11 |
il n'était pas clair si les séquences d'échappement numériques
étaient autorisées dans les littéraux de chaîne UTF-8/16/32 |
clarifié |
| CWG 2870 | C++11 |
le résultat de la concaténation de deux
littéraux de chaîne ordinaires n'était pas clair |
clarifié |
| P1854R4 | C++98 |
les littéraux de chaîne ordinaires et larges avec des caractères
non encodables étaient conditionnellement supportés |
les programmes avec de tels littéraux sont mal formés |
| P2029R4 | C++98 |
1. il n'était pas clair si les littéraux de chaîne
pouvaient contenir des caractères non encodables 2. il n'était pas clair si les littéraux de chaîne pouvaient contenir des séquences d'échappement numériques telles que les unités de code qu'elles représentent ne sont pas représentables dans le type d'élément de tableau des littéraux |
1. rendu conditionnellement supporté pour
les littéraux de chaîne ordinaires et larges [1] 2. mal formé si les unités de code ne sont ni représentables dans le type entier non signé correspondant au type sous-jacent |
- ↑ P1854R4 a été accepté comme DR ultérieurement, annulant cette résolution.
Références
- Norme C++23 (ISO/IEC 14882:2024) :
-
- 5.13.5 Littéraux de chaîne [lex.string]
- Norme C++20 (ISO/CEI 14882:2020) :
-
- 5.13.5 Littéraux de chaîne [lex.string]
- Norme C++17 (ISO/CEI 14882:2017) :
-
- 5.13.5 Littéraux de chaîne [lex.string]
- Norme C++14 (ISO/IEC 14882:2014) :
-
- 2.14.5 Littéraux de chaîne [lex.string]
- Norme C++11 (ISO/CEI 14882:2011) :
-
- 2.14.5 Littéraux de chaîne [lex.string]
- Norme C++03 (ISO/CEI 14882:2003) :
-
- 2.13.4 Littéraux de chaîne [lex.string]
- Norme C++98 (ISO/CEI 14882:1998) :
-
- 2.13.4 Littéraux de chaîne [lex.string]
Voir aussi
| littéraux définis par l'utilisateur (C++11) | littéraux avec suffixe défini par l'utilisateur |
|
documentation C
pour
Littéraux de chaîne
|
|