Fuggire dalla realtà vinto' ti aiuto dato che questo è un letterale crudo, ma la sintassi è progettata per consentire una chiara demarcazione di inizio e fine, introducendo una piccola frase arbitraria come aha
.
R"aha(
Some Text)"
)aha";
A proposito notare l'ordine di )
e "
alla fine, di fronte del vostro esempio.
Per quanto riguarda il formale, a prima vista (lo studio della serie) potrebbe sembrare come se la fuga funziona lo stesso in stringhe letterali prime come in letterali normali. Tranne che uno sa che non è così, quindi com'è possibile, quando non si nota alcuna eccezione nelle regole? Bene, quando sono stati introdotti valori letterali stringhe raw in C++ 11 è stato introdotto un ulteriore che annulla la fase di traduzione, annullando l'effetto di ad es. sfuggire !, a wit, & hellip;
C++ 11 §2.5/3
” Tra i virgolette doppie iniziali e finali della corda grezzo, eventuali trasformazioni eseguite nelle fasi 1 e 2 (trigrammi, universale caratteri -nomi e splicing di linee) vengono ripristinati; questo ripristino si applica d-char,, o la delimitazione delle parentesi viene identificata prima di qualsiasi d-char, d-char .
Questo si prende cura di specifiche dei caratteri Unicode (le universali-character-nomi come \u0042
), che pur apparire e agire come fughe sono formalmente, in C++, non sequenze di escape.
I veri escape formali sono gestiti, o meglio, non gestiti !, utilizzando una regola di grammatica personalizzata per il contenuto di una stringa raw letterale. Vale a dire che in C++ §2.14.5 il prime stringa entità grammatica è definita come
"
d-char-sequenza opt(
r-char-sequenza opt)
d-char-sequenza opt"
dove un r-char-sequenza è definito come una sequenza di r-char, ciascuno dei quali è
” qualsiasi membro del set di caratteri di origine, tranne diritto parentesi )
seguita dall'iniziale d-char-sequenza [come aha
sopra] (che può essere vuoto) seguito da un doppio apice "
In sostanza, quanto sopra significa che non solo non è possibile utilizzare gli escape direttamente nelle stringhe non elaborate (che è molto importante, è positivo, non negativo), non è possibile utilizzare direttamente le specifiche dei caratteri Unicode.
Ecco come farlo indirettamente:
#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";
}
uscita:
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.