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

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

const char [ N ]

(hasta C++20)

const char8_t [ N ]

(desde C++20)
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 R (sintaxis (2,4,6,8,10) ). No escapan ningún carácter, lo que significa que cualquier cosa entre los delimitadores d-char-seq  ( y ) d-char-seq se convierte en parte de la cadena. La secuencia d-char-seq final es la misma secuencia de caracteres que la secuencia d-char-seq inicial.

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

1) Para cada secuencia contigua de basic-s-char s, r-char s, (since C++11) secuencias de escape simples y nombres de caracteres universales , la secuencia de caracteres que denota se codifica en una secuencia de unidades de código utilizando la codificación de caracteres asociada al literal de cadena. Si un carácter carece de representación en la codificación de caracteres asociada, entonces el programa está mal formado.
Si la codificación de caracteres asociada es con estado, la primera de dichas secuencias se codifica comenzando con el estado de codificación inicial y cada secuencia subsiguiente se codifica comenzando con el estado de codificación final de la secuencia anterior.
2) Para cada secuencia de escape numérica , tomando v como el valor entero representado por el número octal o hexadecimal que comprende la secuencia de dígitos en la secuencia de escape, y 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 tipo T , que es congruente con v mod 2 S
    , donde S es el ancho de T .
  • En caso contrario, el programa está mal formado.
Si la codificación de caracteres asociada es con estado, todas esas secuencias no tienen efecto en el estado de codificación.
3) Cada secuencia de escape condicional contribuye una secuencia de unidades de código definida por la implementación.
Si la codificación de caracteres asociada es con estado, está definido por la implementación qué efecto tienen estas secuencias en el estado de codificación.

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.
  • Si un literal de cadena ordinario es adyacente a un literal de cadena ancha, el comportamiento es indefinido.
(until C++11)
  • Si un literal de cadena ordinario es adyacente a un literal de cadena no ordinario, el literal de cadena concatenado es del tipo del último.
  • Si un literal de cadena UTF-8 es adyacente a un literal de cadena ancha, el programa está mal formado.
  • Cualquier otra combinación está condicionalmente soportada con semántica definida por la implementación. [1]
(until C++23)
  • Cualquier otra combinación está mal formada.
(since C++23)
(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"
  1. Ninguna implementación conocida admite dicha concatenación.

Cadenas no evaluadas

Los siguientes contextos esperan un literal de cadena, pero no lo evalúan:

(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 CharT* . Se debe usar una conversión explícita (ej. const_cast ) si se desea dicha conversión.

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