c++ - sociales - sentido literal y figurado
Incluir) "en el literal de cadena sin procesar sin terminar dicho literal (3)
Los dos caracteres )"
terminan el literal de la cadena sin formato en el ejemplo siguiente.
La secuencia )"
podría aparecer en mi texto en algún momento, y quiero que la cadena continúe incluso si esta secuencia se encuentra dentro de ella.
R"(
Some Text)"
)"; // ^^
¿Cómo puedo incluir la secuencia )"
dentro del literal de la cadena sin terminarlo?
Escapar no te ayudará ya que es un literal en bruto, pero la sintaxis está diseñada para permitir una demarcación clara de inicio y finalización, mediante la introducción de una pequeña frase arbitraria como aha
.
R"aha(
Some Text)"
)aha";
Por cierto, tenga en cuenta el orden de )
y "
al final, opuesto a su ejemplo.
En cuanto a lo formal, a primera vista (estudiando el estándar), podría parecer que el escaparse funciona igual en los literales de cadena sin formato que en los literales ordinarios. Excepto que uno sabe que no es así, entonces ¿cómo es eso posible, cuando no se observa una excepción en las reglas? Bueno, cuando se introdujeron los literales de cadena sin formato en C ++ 11, fue introduciendo una fase de traducción de deshacer adicional, deshaciendo el efecto de, por ejemplo, escapar ... a saber, ...
C ++ 11 §2.5 / 3" Entre los caracteres de comillas dobles inicial y final de la cadena sin formato, se revierten todas las transformaciones realizadas en las fases 1 y 2 (trigrafos, nombres de caracteres universales y empalme de líneas); esta reversión se aplicará antes de que se identifique cualquier d-char , r-char o delimitación entre paréntesis.
Esto se ocupa de las especificaciones de caracteres Unicode (los nombres de caracteres universales como /u0042
), que aunque se ven y actúan como escapes, formalmente, en C ++, no son secuencias de escape.
Los verdaderos escapes formales se manejan, o mejor dicho, ¡no se manejan !, utilizando una regla de gramática personalizada para el contenido de un literal de cadena sin procesar. A saber, que en C ++ §2.14.5 la entidad de gramática de cadena cruda se define como
"
d-char-sequence opt(
r-char-sequence opt)
d-char-sequence opt"
donde una secuencia r-char se define como una secuencia de r-char , cada una de las cuales es
" Cualquier miembro del juego de caracteres de origen, excepto un paréntesis de la derecha" seguido de la secuencia de d-char inicial [como
aha
arriba] (que puede estar vacía) seguido de una comilla doble"
Básicamente, lo anterior significa que no solo no puedes usar escapes directamente en cadenas sin formato (que es gran parte del punto, es positivo, no negativo), tampoco puedes usar las especificaciones de caracteres Unicode directamente.
He aquí cómo hacerlo indirectamente:
#include <iostream>
using namespace std;
auto main() -> int
{
cout << "Ordinary string with a ''/u0042'' character./n";
cout << R"(Raw string without a ''/u0042'' character, and no /n either.)" "/n";
cout << R"(Raw string without a ''/u0042'' character, i.e. no '')" "/u0042" R"('' character.)" "/n";
}
Salida:
Ordinary string with a ''B'' character. Raw string without a ''/u0042'' character, and no /n either. Raw string without a ''/u0042'' character, i.e. no ''B'' character.
Puedes usar,
R"aaa(
Some Text)"
)aaa";
Aquí aaa
será su delimitador de cadenas.
Los literales de cadena sin procesar le permiten especificar un delimitador * casi arbitrario:
//choose ### as the delimiter so only )###" ends the string
R"###(
Some Text)"
)###";
* Las reglas exactas son: "cualquier miembro del juego de caracteres fuente básico excepto: espacio, el paréntesis izquierdo (, el paréntesis derecho), la barra invertida / y los caracteres de control que representan la pestaña horizontal, pestaña vertical, alimentación de formulario y nueva línea" (N3936 §2.14.5 [lex.string] gramática) y "como máximo 16 caracteres" (§2.14.5 / 2)