literais String C++
Uma literal de cadeia de caracteres representa uma sequência de caracteres que, juntos, formam uma cadeia de caracteres terminada em nulo. Os caracteres devem ser incluídos entre aspas duplas. Existem os seguintes tipos de literais de cadeias de caracteres:
Literais de cadeias de caracteres estreitas, representadas como "xxx".
Literais de cadeias de caracteres largas, representadas como L"xxx".
Literais de cadeias de caracteres brutas, representadas como R"ddd(xxx) ddd", onde ddd é um delimitador. As literais de cadeias de caracteres brutas podem ser estreitas (representadas com R) ou largas (representadas com LR).
Uma literal de cadeia de caracteres estreita é uma matriz terminada em nulo da constante char que contém qualquer caractere gráfico exceto as aspas duplas ("), a barra invertida (\) ou o caractere de nova linha. Uma literal de cadeia de caracteres estreita pode conter as sequências de escape listadas em Literais de caracteres C++.
const char *narrow = "abcd";
// represents the string: yes\no
const char *escaped = "yes\\no";
Uma literal de cadeia de caracteres larga é uma matriz terminada em nulo da constante wchar_t que contém qualquer caractere gráfico exceto as aspas duplas ("), a barra invertida (\) ou o caractere de nova linha. Uma literal de cadeia de caracteres larga pode conter as sequências de escape listadas em Literais de caracteres C++.
const wchar_t* wide = L"zyxw";
const wchar_t* newline = L"hello\ngoodbye";
Uma literal de cadeia de caracteres bruta é uma matriz terminada em nulo (da constante char ou da constante wchar_t) que contém qualquer caractere gráfico, inclusive as aspas duplas ("), a barra invertida (\) ou o caractere de nova linha. As literais de cadeias de caracteres brutas costumam ser usadas em expressões regulares que utilizam classes de caracteres, bem como em cadeias de caracteres HTML e XML. Para obter exemplos, consulte o seguinte artigo: Bjarne Stroustrup's FAQ on C++11 (Perguntas frequentes de Bjarne Stroustrup sobre o C++11).
// represents the string: An unescaped \ character
const char* raw_narrow = R"(An unescaped \ character)";
// represents the string: An unescaped " character
const wchar_t* raw_wide = LR"(An unescaped " character)";
Um delimitador é uma sequência definida pelo usuário, com até 16 caracteres, que vem imediatamente antes do parêntese de abertura e imediatamente depois do parêntese de fechamento de uma literal de cadeia de caracteres bruta. Você pode usar um delimitador para desambiguizar cadeias de caracteres que contenham tanto aspas duplas quanto parênteses. Isso causa um erro do compilador:
// meant to represent the string: )”
const char* bad_parens = R"()")";
Mas um delimitador resolve essa sintaxe:
const char* good_parens = R"xyz()")xyz";
Você pode construir uma literal de cadeia de caracteres bruta em que há uma nova linha (não o caractere de escape) na origem:
// represents the string: hello
//goodbye
const wchar_t* newline = LR"(hello
goodbye)";
Tamanho das literais de cadeias de caracteres
O tamanho (em bytes) de uma literal de cadeia de caracteres estreita é o número de caracteres mais 1 (para o caractere nulo de terminação); o tamanho (em bytes) de uma literal de cadeia de caracteres larga é o número de caracteres vezes 2 mais 2 (para o caractere nulo de terminação). Isto mostra o tamanho de uma literal de cadeia de caracteres larga:
const wchar_t* str = L"Hello!";
const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);
Note que strlen() e wcslen() não incluem o tamanho do caractere nulo de terminação.
O comprimento máximo de uma literal de cadeia de caracteres é de 65535 bytes. Esse limite se aplica às literais de cadeias de caracteres estreitas e largas.
Modificando literais de cadeias de caracteres
Como as literais de cadeias de caracteres são constantes, tentar modificá-las (por exemplo, str[2] = 'A') causa um erro do compilador.
Específico da Microsoft
No Visual C++, você pode usar uma literal de cadeia de caracteres para inicializar um ponteiro para a não constante char ou wchar_t. Isso é permitido no código C, mas é preterido no C++98 e removido no C++11. Uma tentativa de modificar a cadeia de caracteres causa uma violação de acesso, como neste exemplo:
wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation
Você pode fazer com que o compilador emita um erro quando uma literal de cadeia de caracteres é convertida em um caractere non_const ao definir a opção de compilador /Zc:strictStrings (Desativar conversão de tipo literal de cadeia de caracteres). É uma boa prática usar a palavra-chave auto para declarar ponteiros inicializados por literais de cadeias de caracteres, pois ela é resolvida para o tipo correto (const). Este exemplo mostra uma tentativa de gravar em uma literal de cadeia de caracteres em tempo de compilação:
auto str = L"hello";
str[2] = L'a'; // Compiler error: you cannot assign to a variable that is const
Em alguns casos, literais de cadeias de caracteres idênticas podem ser agrupadas para economizar espaço no arquivo executável. Em pools de literais de cadeias de caracteres, o compilador faz com que todas as referências a uma literal de cadeia de caracteres específica apontem para o mesmo local na memória, em vez de cada referência apontar para uma instância separada da literal. Para habilitar o agrupamento de cadeias de caracteres em pools, use a opção de compilador /GF.
Fim de Específico da Microsoft
Concatenando literais de cadeias de caracteres adjacentes
As literais de cadeias de caracteres adjacentes são concatenadas. Esta declaração:
char str[] = "12" "34";
é idêntica a esta declaração:
char atr[] = "1234";
e a esta declaração:
char atr[] = "12\
34";
Usar códigos de escape hexadecimais inseridos para especificar constantes de cadeias de caracteres pode causar resultados inesperados. O exemplo a seguir visa criar uma literal de cadeia de caracteres que contenha o caractere ASCII 5, seguido pelos caracteres "f", "i", "v" e "e":
"\x05five"
O resultado real é um 5F hexadecimal, que é o código ASCII de um sublinhado, seguido pelos caracteres i, v e e. Para obter o resultado correto, você pode usar uma destas opções:
"\005five" // Use octal constant.
"\x05" "five" // Use string splicing.
Literais da cadeia de caracteres com caracteres Unicode
Pares alternativos e caracteres suplementares (como em UTF-16) são representados com um prefixo \U. São cadeias de caracteres largas em vez de caracteres únicos, as quais são representadas com aspas duplas em vez de aspas simples. Os prefixos U, u e u8 não são compatíveis.
const wchar_t* str1 = L"\U0002008A";
const wchar_t* str2 = L"\UD869DED6";
const wchar_t* str3 = L"\Udc00c800";
Para obter mais informações sobre Unicode, consulte Unicode). Para obter mais informações sobre pares alternativos, consulte Surrogate Pairs and Supplementary Characters (Pares alternativos e caracteres suplementares).