UPDATE - questa risposta, sebbene sembrasse avere senso per me e per gli altri, risulta essere ampiamente sbagliata (e sufficientemente errata rispetto all'intento, da essere effettivamente semplicemente sbagliata). Poiché (come sottolineato in un commento di AProgrammer) è non autorizzato ad usare l'UCS al di fuori delle costanti di stringa quando lo stesso personaggio potrebbe essere rappresentato normalmente nel set di caratteri di base. Quindi, non usarlo per evitare parole chiave, come nel mio esempio; e non utilizzarlo per creare "identificatori" come 23skiddo
eseguendo l'escape di 2
. Potrebbe ancora essere usato per rendere i nomi compatibili con le lingue esterne, immagino, ma solo, a quanto pare, quando quei nomi iniziano con una lettera o un carattere esteso e contengono solo lettere, cifre, sottolineatura e caratteri estesi - che sembra troppo restrittivo per supportare adeguatamente quell'intento. Quindi deve essere che l'intento principale sia (come nella risposta di AProgrammer) di consentire questi caratteri extra negli identificatori e abilitare gli editor di sorgenti in cui questi caratteri sono visualizzati graficamente, pur consentendo al file sorgente di essere in ASCII normale.
I programmi C ++ possono chiamare funzioni scritte in altre lingue. È buona norma da parte del comitato di standardizzazione garantire che il C ++ sia interoperabile con altri linguaggi che potrebbero consentire caratteri non alfanumerici o unicode nei nomi di funzioni, anche se tali lingue non esistono ancora. Lo standard non ha bisogno di specificare come funzionerà a livello di linker, ecc; ma è bene avere un meccanismo specifico in atto per consentirlo.
Non è necessario guardare nel futuro per vederne un uso. Supponiamo che abbia una vecchia libreria C con una funzione chiamata catch
(o protetta o mutabile) ... e voglio chiamarla da C ++. E per qualsiasi ragione non posso o non voglio modificare il codice C (a proposito, ho più di una volta dovuto occuparmi del vecchio codice C che usava un nome di funzione che era diventato una parola chiave C ++ ...)
Con i nomi UC posso scrivere questo in un'intestazione, e poi chiamare semplicemente '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); }
Certo è brutto, ma non importa dal momento che è solo in un posto nell'intestazione. Lo stesso approccio potrebbe essere utilizzato per creare stub per chiamare funzioni in altre lingue e funziona anche se i nomi sono parole chiave o unicode in C ++, oppure hanno spazi, .
o altra punteggiatura incorporata in essi
Varie altre lingue hanno dispositivi che consentono la creazione di identificatori che non seguono lo schema generale; per esempio in Verilog, \abcd
è un identificatore equivalente a abcd
, ma \while
e skidoo
e .e2
sono anch'essi identificatori, che hanno bisogno del prefisso backslash per essere visto come tale. A causa del modo in cui Verilog viene utilizzato, è importante consentire qualsiasi nome, in cui si riferiscono a interfacce esterne.