variable - ¿Cuál es el punto de los literales de caracteres UTF-8 propuestos para C++ 17?
¿cuál de las siguientes cadenas es un nombre de variable válido ? (1)
¿Cuál es exactamente el punto de estos como lo propone N4267 ?
Su única función parece ser evitar que se especifiquen los caracteres ASCII extendidos o los puntos de código UTF-8 parciales. Todavía se almacenan en un char de 8 bits de ancho fijo (lo cual, según tengo entendido, es la forma correcta y la mejor manera de manejar UTF-8 para casi todos los casos de uso), por lo que no admiten caracteres no ASCII en todos. Que esta pasando?
(En realidad, tampoco estoy completamente seguro de entender la necesidad de los literales de cadena UTF-8. ¿Supongo que es la preocupación de los compiladores hacer cosas extrañas / ambiguas con cadenas Unicode junto con la validación de Unicode?)
La razón está cubierta por Evolution Working Group, número 119: N4197 Adición de literales de u8 caracteres, [minúsculo] ¿Por qué no literales de u8 caracteres? que siguió la propuesta y dice:
Tenemos cinco prefijos de codificación para literales de cadenas (ninguno, L, u8, u, U) pero solo cuatro para literales de caracteres; el faltante es u8 para literales de caracteres.
Esto es importante para implementaciones en las que el conjunto de caracteres de ejecución restringida no es ASCII. En tal caso, los literales de u8 caracteres proporcionarían una forma ideal para escribir literales de caracteres con codificación ASCII garantizada (las codificaciones de u8 de unidad de código único son exactamente ASCII), pero ... no los proporcionamos. En cambio, lo mejor que se puede hacer es algo como esto:
char x_ascii = { u''x'' };
... donde obtendremos un error de reducción si el punto de código no cabe en un ''char''. (Tenga en cuenta que esto no es exactamente lo mismo que u8''x '', lo que nos daría un error si el punto de código no se pudiera representar como una unidad de código única en UTF-8).