Namespaces
Variants

String literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

const char [ N ]

(jusqu'à C++20)

const char8_t [ N ]

(depuis C++20)
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 R (syntaxes (2,4,6,8,10) ). Ils n'échappent aucun caractère, ce qui signifie que tout ce qui se trouve entre les délimiteurs d-char-seq  ( et ) d-char-seq fait partie de la chaîne. La séquence de fin d-char-seq est la même séquence de caractères que la séquence initiale d-char-seq .

// 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 :

1) Pour chaque séquence contiguë de basic-s-char s, r-char s, (depuis C++11) séquences d'échappement simples et noms de caractères universels , la séquence de caractères qu'elle désigne est encodée en une séquence d'unités de code en utilisant l'encodage de caractères associé au littéral de chaîne. Si un caractère n'a pas de représentation dans l'encodage de caractères associé, alors le programme est mal formé.
Si l'encodage de caractères associé est à état, la première de ces séquences est encodée en commençant par l'état d'encodage initial et chaque séquence suivante est encodée en commençant par l'état d'encodage final de la séquence précédente.
2) Pour chaque séquence d'échappement numérique , en prenant v comme la valeur entière représentée par le nombre octal ou hexadécimal composant la séquence de chiffres dans la séquence d'échappement, et 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 type T , qui est congruente à v mod 2 S
    , où S est la largeur de T .
  • Sinon, le programme est mal formé.
Si l'encodage de caractères associé est avec état, toutes ces séquences n'ont aucun effet sur l'état d'encodage.
3) Chaque séquence d'échappement conditionnelle contribue une séquence d'unités de code définie par l'implémentation.
Si l'encodage de caractères associé est avec état, il est défini par l'implémentation quel effet ces séquences ont sur l'état d'encodage.

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.
  • Si un littéral de chaîne ordinaire est adjacent à un littéral de chaîne large, le comportement est indéfini.
(jusqu'à C++11)
  • Si un littéral de chaîne ordinaire est adjacent à un littéral de chaîne non ordinaire, le littéral de chaîne concaténé est du type du dernier.
  • Si un littéral de chaîne UTF-8 est adjacent à un littéral de chaîne large, le programme est mal formé.
  • Toute autre combinaison est conditionnellement prise en charge avec une sémantique définie par l'implémentation. [1]
(jusqu'à C++23)
  • Toute autre combinaison est mal formée.
(depuis C++23)
(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"
  1. 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 :

(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 CharT* non constants. Un cast explicite (tel que const_cast ) doit être utilisé si une telle conversion est souhaitée.

(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
  1. 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