Siguiendo una pregunta relacionada , me gustaría preguntar sobre los nuevos tipos de caracteres y literales de cadena en C ++ 11. Parece que ahora tenemos cuatro tipos de caracteres y cinco tipos de cadenas literales. Los tipos de personajes:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
Y los literales de cadena:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
La pregunta es la siguiente: ¿Las referencias de caracteres \x
/ \u
/ \U
se pueden combinar libremente con todos los tipos de cadenas? ¿Todos los tipos de cadenas son de ancho fijo, es decir, las matrices contienen exactamente tantos elementos como aparecen en el literal, o las referencias a \x
/ \u
/ \U
se expanden en un número variable de bytes? ¿Las cadenas u""
y u8""
tienen semántica de codificación, por ejemplo, puedo decir char16_t x[] = u"\U0010FFFF"
, y el punto de código que no es BMP se codifica en una secuencia UTF16 de dos unidades? ¿Y de manera similar para u8
? En (1), ¿puedo escribir sustitutos solitarios con \u
? Finalmente, ¿alguna de las funciones de cadena es consciente de la codificación (es decir, son conscientes de los caracteres y pueden detectar secuencias de bytes no válidas)?
Esta es una pregunta un poco abierta, pero me gustaría obtener una imagen lo más completa posible de la nueva codificación UTF y las funciones de tipo del nuevo C ++ 11.
u"\U0010FFFF"
en un par sustituto.