2015-05-18 15 views
31

I due personaggi )" terminano la stringa grezzo letterale nell'esempio qui sotto.
La sequenza )" potrebbe apparire nel mio testo ad un certo punto, e voglio la stringa da continuare anche . se questa sequenza viene trovato all'interno di essoinclude)" nella stringa grezza letterale senza terminare detto letterali

R"( 
    Some Text)" 
)";  // ^^ 

Come posso comprendere la sequenza )" all'interno della stringa letterale senza terminare lo

risposta

56

Raw string literals consentono di specificare quasi arbitrario * delimitatore:?

//choose ### as the delimiter so only)###" ends the string 
R"###( 
    Some Text)" 
)###"; 

* Le regole esatte sono: "qualsiasi membro del carattere di base del sorgente eccetto: spazio, la parentesi sinistra (, la parentesi a destra), il backslash \, ei caratteri di controllo rappresentando scheda orizzontale, scheda verticale, avanzamento pagina, e newline"(N3936 §2.14.5 [lex.string] grammatica) e "al massimo 16 caratteri"(§2.14.5/2)

23

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. 
2

È possibile utilizzare,

R"aaa( 
    Some Text)" 
)aaa"; 

Qui aaa sarà il vostro delimitatore di stringa.