String literal
Contenidos |
Sintaxis
"
s-char-seq
(opcional)
"
|
(1) | ||||||||
R"
d-char-seq
(opcional)
(
r-char-seq
(opcional)
)
d-char-seq
(opcional)
"
|
(2) | (desde C++11) | |||||||
L"
s-char-seq
(opcional)
"
|
(3) | ||||||||
LR"
d-char-seq
(opcional)
(
r-char-seq
(opcional)
)
d-char-seq
(opcional)
"
|
(4) | (desde C++11) | |||||||
u8"
s-char-seq
(opcional)
"
|
(5) | (desde C++11) | |||||||
u8R"
d-char-seq
(opcional)
(
r-char-seq
(opcional)
)
d-char-seq
(opcional)
"
|
(6) | (desde C++11) | |||||||
u"
s-char-seq
(opcional)
"
|
(7) | (desde C++11) | |||||||
uR"
d-char-seq
(opcional)
(
r-char-seq
(opcional)
)
d-char-seq
(opcional)
"
|
(8) | (desde C++11) | |||||||
U"
s-char-seq
(opcional)
"
|
(9) | (desde C++11) | |||||||
UR"
d-char-seq
(opcional)
(
r-char-seq
(opcional)
)
d-char-seq
(opcional)
"
|
(10) | (desde C++11) | |||||||
Explicación
| s-char-seq | - | Una secuencia de uno o más s-char s |
| s-char | - |
Uno de
|
| basic-s-char | - | Un carácter del juego de caracteres fuente básico (hasta C++23) juego de caracteres de traducción (desde C++23) , excepto las comillas dobles " , barra invertida \ , o carácter de nueva línea |
| d-char-seq | - | Una secuencia de uno o más d-char s, de máximo 16 caracteres de longitud |
| d-char | - | Un carácter del juego de caracteres fuente básico (hasta C++23) juego de caracteres básico (desde C++23) , excepto paréntesis, barra invertida y espacios |
| r-char-seq | - |
Una secuencia de uno o más
r-char
s, excepto que no debe contener la secuencia de cierre
)
d-char-seq
"
|
| r-char | - | Un carácter del juego de caracteres fuente básico (hasta C++23) juego de caracteres de traducción (desde C++23) |
| Sintaxis | Tipo | Clase | Codificación | ||||
|---|---|---|---|---|---|---|---|
| (1,2) | literal de cadena ordinario | const char [ N ] | codificación literal ordinaria | ||||
| (3,4) | literal de cadena ancho | const wchar_t [ N ] | codificación literal ancha | ||||
| (5,6) | literal de cadena UTF-8 |
|
UTF-8 | ||||
| (7,8) | literal de cadena UTF-16 | const char16_t [ N ] | UTF-16 | ||||
| (9,10) | literal de cadena UTF-32 | const char32_t [ N ] | UTF-32 |
En los tipos listados en la tabla anterior, N es el número de unidades de código codificadas, el cual se determina a continuación .
Los literales de cadena ordinarios y UTF-8 (desde C++11) se denominan colectivamente literales de cadena estrecha.
La evaluación de un string literal resulta en un objeto de string literal con duración de almacenamiento estática . Si todos los string literals se almacenan en objetos no superpuestos y si evaluaciones sucesivas de un string literal producen el mismo objeto o uno diferente no está especificado.
El efecto de intentar modificar un objeto de cadena literal es indefinido.
bool b = "bar" == 3 + "foobar"; // puede ser verdadero o falso, no especificado const char* pc = "Hello"; char* p = const_cast<char*>(pc); p[0] = 'M'; // comportamiento indefinido
Literales de cadena sin formato
Los literales de cadena sin formato son literales de cadena con un prefijo que contiene
// OK: contiene una barra invertida, // equivalente a "\\" R"(\)"; // OK: contiene cuatro pares \n, // equivalente a "\\n\\n\\n\\n" R"(\n\n\n\n)"; // OK: contiene un paréntesis de cierre, dos comillas dobles y un paréntesis de apertura, // equivalente a ")\"\"(" R"-()""()-"; // OK: equivalente a "\n)\\\na\"\"\n" R"a( )\ a"" )a"; // OK: equivalente a "x = \"\"\\y\"\"" R"(x = ""\y"")"; // R"<<(-_-)>>"; // Error: los delimitadores inicial y final no coinciden // R"-()-"-()-"; // Error: )-" aparece en el medio y termina el literal |
(desde C++11) |
Inicialización
Los objetos de cadena literal se inicializan con la secuencia de valores de unidad de código correspondientes a la secuencia de s-char s y r-char s (desde C++11) , más un carácter nulo terminador (U+0000), en orden como sigue:
T
como el tipo de elemento del array del literal de cadena (ver la tabla
anterior
):
-
Si
v
no excede el rango de valores representables de
T, entonces la secuencia de escape contribuye con una única unidad de código con valor v . -
En caso contrario, si
el literal de cadena es de sintaxis
(1)
o
(3)
, y
(desde C++11)
v
no excede el rango de valores representables del tipo sin signo correspondiente para el tipo subyacente de
T, entonces la secuencia de escape contribuye con una única unidad de código con un valor único de tipoT, que es congruente con v mod 2 S
, donde S es el ancho deT. - En caso contrario, el programa está mal formado.
Concatenación
Los literales de cadena adyacentes se concatenan en la fase de traducción 6 (después del preprocesamiento):
- Si los dos literales de cadena son del mismo tipo , el literal de cadena concatenado también es de ese tipo.
|
(until C++11) | ||||
|
(since C++11) |
"Hello, " "world!" // en la fase 6, los 2 literales de cadena forman "Hello, world!" L"Δx = %" PRId16 // en la fase 4, PRId16 se expande a "d" // en la fase 6, L"Δx = %" y "d" forman L"Δx = %d"
- ↑ Ninguna implementación conocida admite dicha concatenación.
Cadenas no evaluadas
Los siguientes contextos esperan un literal de cadena, pero no lo evalúan:
- language linkage especificación
|
(desde C++11) |
|
(desde C++14) |
|
(desde C++20) |
| (desde C++26) |
|
No está especificado si los literales de cadena no ordinarios están permitidos en estos contextos , excepto que un nombre de operador literal debe usar un literal de cadena ordinario (since C++11) . |
(until C++26) |
|
Solo se permiten literales de cadena ordinarios en estos contextos. Cada nombre de carácter universal y cada secuencia de escape simple en una cadena no evaluada se reemplaza por el miembro del juego de caracteres de traducción que denota. Una cadena no evaluada que contiene una secuencia de escape numérica o una secuencia de escape condicional está mal formada. |
(since C++26) |
Notas
Los literales de cadena pueden utilizarse para inicializar arrays de caracteres . Si un array se inicializa como char str [ ] = "foo" ; , str contendrá una copia de la cadena "foo" .
|
Los literales de cadena son convertibles y asignables a no-const char * o wchar_t * para ser compatibles con C, donde los literales de cadena son de tipos char [ N ] y wchar_t [ N ] . Esta conversión implícita está obsoleta. |
(hasta C++11) |
|
Los literales de cadena no son convertibles ni asignables a no-const
|
(desde C++11) |
Un literal de cadena no es necesariamente una secuencia de caracteres terminada en nulo: si un literal de cadena tiene caracteres nulos incrustados, representa un array que contiene más de una cadena.
const char* p = "abc\0def"; // std::strlen(p) == 3, pero el array tiene tamaño 8
Si un dígito hexadecimal válido sigue a una secuencia de escape hexadecimal en un literal de cadena, fallaría al compilar como una secuencia de escape inválida. La concatenación de cadenas puede usarse como solución alternativa:
//const char* p = "\xfff"; // error: secuencia de escape hexadecimal fuera de rango const char* p = "\xff""f"; // OK: el literal es const char[3] que contiene {'\xff','f','\0'}
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_char8_t
|
202207L
|
(C++23)
(DR20) |
char8_t corrección de compatibilidad y portabilidad (permite inicialización de arrays de ( unsigned ) char desde literales de cadena UTF-8) |
__cpp_raw_strings
|
200710L
|
(C++11) | Literales de cadena crudos |
__cpp_unicode_literals
|
200710L
|
(C++11) | Literales de cadena Unicode |
Ejemplo
#include <iostream> // array1 y array2 contienen los mismos valores: char array1[] = "Foo" "bar"; char array2[] = {'F', 'o', 'o', 'b', 'a', 'r', '\0'}; const char* s1 = R"foo( Hello World )foo"; // igual que const char* s2 = "\nHello\n World\n"; // igual que const char* s3 = "\n" "Hello\n" " World\n"; const wchar_t* s4 = L"ABC" L"DEF"; // OK, igual que const wchar_t* s5 = L"ABCDEF"; const char32_t* s6 = U"GHI" "JKL"; // OK, igual que const char32_t* s7 = U"GHIJKL"; const char16_t* s9 = "MN" u"OP" "QR"; // OK, igual que const char16_t* sA = u"MNOPQR"; // const auto* sB = u"Mixed" U"Types"; // antes de C++23 puede o no ser compatible con // la implementación; mal formado desde C++23 const wchar_t* sC = LR"--(STUV)--"; // OK, literal de cadena cruda int main() { std::cout << array1 << ' ' << array2 << '\n' << s1 << s2 << s3 << std::endl; std::wcout << s4 << ' ' << s5 << ' ' << sC << std::endl; }
Salida:
Foobar Foobar Hello World Hello World Hello World ABCDEF ABCDEF STUV
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
|
CWG 411
( P2029R4 ) |
C++98 |
las secuencias de escape en literales de cadena
no podían mapear a múltiples unidades de código |
permitido |
|
CWG 1656
( P2029R4 ) |
C++98 |
los caracteres denotados por secuencias de escape numéricas
en literales de cadena no estaban claros |
aclarado |
| CWG 1759 | C++11 |
un literal de cadena UTF-8 podría tener unidades
de código que no son representables en char |
char puede representar todas las unidades de código UTF-8 |
| CWG 1823 | C++98 |
si los literales de cadena son distintos
estaba definido por la implementación |
la distinción no está especificada, y el mismo
literal de cadena puede producir objetos diferentes |
|
CWG 2333
( P2029R4 ) |
C++11 |
no estaba claro si las secuencias de escape numéricas
estaban permitidas en literales de cadena UTF-8/16/32 |
aclarado |
| CWG 2870 | C++11 |
el resultado de la concatenación de dos
literales de cadena ordinarios no estaba claro |
aclarado |
| P1854R4 | C++98 |
los literales de cadena ordinarios y anchos con caracteres
no codificables tenían soporte condicional |
los programas con dichos literales están mal formados |
| P2029R4 | C++98 |
1. no estaba claro si los literales de cadena
podían contener caracteres no codificables 2. no estaba claro si los literales de cadena podían contener secuencias de escape numéricas tales que las unidades de código que representan no son representables en el tipo de elemento del array del literal |
1. hecho con soporte condicional para
literales de cadena ordinarios y anchos [1] 2. mal formado si las unidades de código no son representables ni en el tipo entero sin signo correspondiente al tipo subyacente |
- ↑ P1854R4 fue aceptado como un DR posteriormente, anulando esta resolución.
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 5.13.5 Literales de cadena [lex.string]
- Estándar C++20 (ISO/IEC 14882:2020):
-
- 5.13.5 Literales de cadena [lex.string]
- Estándar C++17 (ISO/IEC 14882:2017):
-
- 5.13.5 Literales de cadena [lex.string]
- Estándar C++14 (ISO/IEC 14882:2014):
-
- 2.14.5 Literales de cadena [lex.string]
- Estándar C++11 (ISO/IEC 14882:2011):
-
- 2.14.5 Literales de cadena [lex.string]
- Estándar C++03 (ISO/IEC 14882:2003):
-
- 2.13.4 Literales de cadena [lex.string]
- Estándar C++98 (ISO/IEC 14882:1998):
-
- 2.13.4 Literales de cadena [lex.string]
Véase también
| literales definidos por el usuario (C++11) | literales con sufijo definido por el usuario |
|
Documentación de C
para
Literales de cadena
|
|