ATUALIZAÇÃO - essa resposta, embora pareça fazer sentido para mim e para os outros, acaba por estar amplamente errada (e suficientemente errada em relação à intenção, como efetivamente errada). Como (como apontado em um comentário do AProgrammer), não é permitido usar o UCS fora das constantes da string quando o mesmo caractere pode ser representado normalmente no conjunto de caracteres base. Portanto, não é possível usá-lo para escapar de palavras-chave, como no meu exemplo; e não usá-lo para criar 'identificadores' 23skiddo
escapando do2
. Ainda poderia ser usado para tornar os nomes compatíveis com idiomas externos, eu acho, mas apenas ao que parece, quando esses nomes começam com uma letra ou um caractere estendido e contêm apenas letras, dígitos, sublinhado e caracteres estendidos - o que parece muito restritivo para apoiar adequadamente essa intenção. Portanto, deve ser que a intenção principal seja (como na resposta do AProgrammer) permitir esses caracteres extras nos identificadores e habilitar os editores de origem onde esses caracteres são exibidos graficamente, enquanto ainda permite que o arquivo de origem esteja em ASCII simples.
Programas C ++ podem chamar funções escritas em outros idiomas. É uma boa estratégia por parte do comitê de padronização garantir que o C ++ seja interoperável com outros idiomas, o que pode permitir caracteres não alfanuméricos ou unicode nos nomes das funções, mesmo que esses idiomas ainda não existam. O padrão não precisa especificar como isso funcionará no nível do vinculador, etc; mas é bom ter um mecanismo especificado em vigor para permitir isso.
Você não precisa olhar para o futuro para ver uma utilidade para isso. Suponha que eu tenha uma biblioteca C antiga com uma função chamada catch
(ou protegida ou mutável) ... e que eu queira chamá-la de C ++. E por qualquer motivo, não posso ou não quero modificar o código C (a propósito, mais de uma vez tive que lidar com códigos C antigos que usavam um nome de função que se tornara uma palavra-chave C ++ ...)
Com nomes de UC, posso escrever isso em um cabeçalho e, em seguida, basta chamar 'catch_func ()':
extern "C" {
int catc\u0068( int a, int b ); // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }
Claro que é feio, mas não importa, pois está apenas em um lugar no cabeçalho. A mesma abordagem pode ser usada para criar stubs para chamar funções em outros idiomas e funciona mesmo se os nomes forem palavras-chave em C ++ ou unicode, ou tiverem espaços .
ou outra pontuação incorporada neles
Vários outros idiomas possuem dispositivos que permitem a criação de identificadores que não seguem o padrão geral; por exemplo em Verilog, \abcd
é um identificador equivalente a abcd
, mas \while
e \23skidoo
e \44.e2
são identificadores também, que necessitam o prefixo barra invertida para ser vistos como tal. Devido à maneira como o Verilog é usado, é importante permitir qualquer nome, onde eles se relacionam com interfaces externas.