AKTUALIZACJA - ta odpowiedź, choć dla mnie i innych wydawała się sensowna, okazuje się być w dużej mierze błędna (i wystarczająco błędna w odniesieniu do intencji, aby faktycznie była po prostu błędna). Ponieważ (jak wskazano w komentarzu AProgrammer) nie można używać LUW poza stałymi ciągami, gdy ten sam znak może być normalnie reprezentowany w podstawowym zestawie znaków. Więc nie używam go do ucieczki słów kluczowych, jak w moim przykładzie; i bez używania go do tworzenia „identyfikatorów”, takich jak 23skiddo
ucieczka od2
. Wydaje mi się, że nadal można go używać do kompatybilności nazw z językami zewnętrznymi, ale tylko wydaje się, że kiedy te nazwy zaczynają się od litery lub znaku rozszerzonego i zawierają tylko litery, cyfry, podkreślenie i znaki rozszerzone - które wydaje się o wiele zbyt restrykcyjne, aby właściwie wspierać ten zamiar. Tak więc musi być tak, że głównym celem jest (jak w odpowiedzi AProgrammera), aby pozwolić tym dodatkowym znakom w identyfikatorach i umożliwić edytorom źródłowym, gdzie te znaki są wyświetlane graficznie, jednocześnie pozwalając, aby plik źródłowy był w postaci zwykłego ASCII.
Programy C ++ mogą wywoływać funkcje napisane w innych językach. Dobrą strategią komitetu normalizacyjnego jest zapewnienie, że C ++ będzie interoperacyjny z innymi językami, które mogą dopuszczać znaki inne niż alfanumeryczne lub znaki Unicode w nazwach funkcji, nawet jeśli takie języki jeszcze nie istnieją. Standard nie musi określać, jak to będzie działać na poziomie linkera itp .; ale dobrze jest mieć określony mechanizm pozwalający na to.
Nie musisz patrzeć w przyszłość, aby zobaczyć zastosowanie. Załóżmy, że mam starą bibliotekę C z funkcją o nazwie catch
(lub chronioną lub zmienną) ... i chcę ją wywołać z C ++. I z jakiegokolwiek powodu nie mogę lub nie chcę modyfikować kodu C (nawiasem mówiąc, nieraz miałem do czynienia ze starym kodem C, który używał nazwy funkcji, która stała się słowem kluczowym C ++ ...)
Z nazwami UC mogę napisać to w nagłówku, a następnie po prostu wywołać „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); }
Jasne, że jest brzydka, ale to nie ma znaczenia, ponieważ jest tylko w jednym miejscu w nagłówku. To samo podejście można zastosować do tworzenia kodów pośredniczących do wywoływania funkcji w innych językach i działa nawet wtedy, gdy nazwy są słowami kluczowymi C ++ lub Unicode, lub zawierają spacje .
lub inną interpunkcję
Różne inne języki mają urządzenia umożliwiające tworzenie identyfikatorów, które nie są zgodne z ogólnym wzorcem; na przykład w Verilogu, \abcd
jest równoważny identyfikator do abcd
, ale \while
i \23skidoo
a \44.e2
są zbyt identyfikatory, które powinny prefiks backslash być postrzegane jako takie. Ze względu na sposób korzystania z Verilog ważne jest, aby w ogóle dopuszczać dowolne nazwy, jeśli dotyczą one interfejsów zewnętrznych.