В предыдущем ответе, который я дал, я ответил на следующее предупреждение, вызванное тем фактом, что '\u0B95'
требуется три байта, а также многохарактерный литерал:
warning: multi-character character constant [-Wmultichar]
Но на самом деле, я не думаю, что я прав, и я не думаю, что gcc тоже. Стандартные состояния:
Литерал обычного характера, содержащий более одного c- char, является многоканальным литералом.
Одно производственное правило для c- char является универсальным символьным именем (т.е. \uXXXX
или \UXXXXXXXX
). Поскольку \u0B95
является единственным c- char, это не многохарактерный литерал. Но теперь это становится беспорядочным. В стандарте также говорится:
Литерал обычного символа, который содержит один c- char, имеет тип
char
со значением, равным числовому значению кодирования c- char в наборе символов выполнения.
Таким образом, мой литерал имеет тип char
и значение символа в наборе символов выполнения (или значение, определяемое реализацией, если оно не существует в этом наборе). char
определяется только как достаточно большой для хранения любого элемента базового набора символов (который на самом деле не определен стандартом, но я предполагаю, что это означает базовый набор символов выполнения):
Объекты, объявленные как символы (char), должны быть достаточно большими, чтобы хранить любой элемент базового набора символов реализаций.
Поэтому, поскольку набор символов выполнения является надмножеством всех значений, которые может выполняться a char
, мой символ может не соответствовать char
.
Итак, какое значение имеет мой char
? Кажется, это нигде не определено. Стандарт говорит, что для char16_t
литералов, если значение не является представимым, программа плохо сформирована. Тем не менее, он ничего не говорит о обычных литералах.
Итак, что происходит? Это просто беспорядок в стандарте или мне что-то не хватает?