usar operaciones manejo funciones declarar con como caracteres cadenas cadena c++ c++11 standards string-literals

operaciones - ¿Cuál es la razón fundamental para el paréntesis en los literales de cadenas sin procesar de C++ 11 R "(...)"?



manejo de cadenas en c++ (1)

El propósito de los paréntesis es permitirle especificar un delimitador personalizado:

R"foo(Hello World)foo" // the string "Hello World"

En su ejemplo, y en el uso típico, el delimitador está simplemente vacío, por lo que la cadena sin procesar está encerrada por las secuencias R"( y )" .

Permitir delimitadores arbitrarios es una decisión de diseño que refleja el deseo de proporcionar una solución completa sin limitaciones extrañas o casos extremos. Puede seleccionar cualquier secuencia de caracteres que no ocurra en su cadena como el delimitador.

Sin esto, estarías en problemas si la cadena en sí tuviera algo así como " (si hubieras querido R"..." como la sintaxis de la cadena de caracteres sin formato) o )" (si el delimitador está vacío). Ambas son secuencias de caracteres comunes y frecuentes, especialmente en expresiones regulares, por lo que sería increíblemente molesto si la decisión de utilizar o no una cadena en bruto dependiera del contenido específico de la cadena.

Recuerde que dentro de la cadena sin formato no hay otro mecanismo de escape, por lo que lo mejor que podía hacer era concatenar literalmente las cadenas de texto, lo que sería muy poco práctico. Al permitir un delimitador personalizado, todo lo que necesita hacer es elegir una secuencia de caracteres inusual una vez, y tal vez modificarla en casos muy raros cuando realice una edición futura.

Pero, para hacer hincapié una vez más, incluso el delimitador vacío ya es útil, ya que la sintaxis R"(...)" permite colocar comillas entre comillas. Eso por sí solo es una gran ganancia.

Hay una característica muy conveniente introducida en C ++ 11 llamada literales de cadena sin formato, que son cadenas sin caracteres de escape. Y en lugar de escribir esto:

regex mask("//t[0-9]+//.[0-9]+//t////SUB");

Simplemente puede escribir esto:

regex mask(R"(/t[0-9]+/.[0-9]+/t//SUB)");

Bastante más legible Sin embargo, tenga en cuenta paréntesis adicionales alrededor de la cadena que debe colocar para definir un literal de cadena sin procesar.

Mi pregunta es, ¿por qué los necesitamos? Para mí, parece bastante feo e ilógico. Aquí están los contras de lo que veo:

  • Verbosidad adicional, mientras que toda la característica se usa para hacer que los literales sean más compactos
  • Es difícil distinguir entre el cuerpo de los símbolos literales y los que definen

Eso es lo que quiero decir con la distinción difícil:

"good old usual string literal" ^- body inside quotes -^ R"(new strange raw string literal)" ^- body inside parenthesis -^

Y aquí está el profesional:

  • Más flexibilidad, más caracteres disponibles en cadenas sin formato, especialmente cuando se usa con el delimitador: "delim( can use () here )delim"

Pero, oye, si necesitas más flexibilidad, tienes antiguos buenos literales de cadenas que se pueden escapar. ¿Por qué el comité estándar decidió contaminar el contenido de cada literal de cadena sin procesar con estos paréntesis absolutamente innecesarios? ¿Cuál fue la razón detrás de eso? ¿Cuáles son los pros que no mencioné?