Стандарт, кажется, имеет два разных ответа на char16_t
литералы, содержащие символ, который не может быть представлен char16_t
, Прежде всего, если значение кодовой точки не может быть представлено в 16 битах (т. Е. Оно не находится в базовой многоязычной плоскости (BMP)), то программа является некорректной (§2.14.3 / 2):
Значение
char16_t
литерал, содержащий один с-символ равно значению его кодовой точки ISO 10646, при условии, что кодовая точка может быть представлена одной 16-битной кодовой единицей. (То есть при условии, что это базовая многоязычная кодовая точка плоскости.) Если значение не может быть представлено в 16 битах, программа некорректна.
поскольку \U0001ABCD
это один с-символ1 но не в BMP, программа, содержащая это плохо сформирована.
Хорошо, но позже в той же главе говорится, что если значение выходит за пределы определенного реализацией диапазона char16_t
тогда у литерала есть значение, определенное реализацией (§2.14.3 / 4):
Значение символьного литерала определяется реализацией, если оно выходит за пределы определенного реализацией диапазона, определенного для […]
char16_t
(для литералов с префиксомu
’) […]
Поскольку определенный для реализации диапазон для char16_t
должно быть не менее 16 битов (чтобы иметь возможность хранить весь BMP), мы уже знаем, что программа плохо сформирована для значения, которое выходит за пределы этого диапазона. Почему стандарт не дает ему значение, определяемое реализацией?
1 Правила производства с-символ -> универсальный характер имя -> \U
гекс-квад гекс-квад
Программа некорректна согласно 2.14.3 / 2, что означает, что ошибка должна быть диагностирована. Больше нет необходимости анализировать, потому что реализации не требуются для завершения компиляции или для создания исполняемого файла. Можно считать, что литерал все еще имеет значение, но это вряд ли имеет значение.
(Хотя реализациям разрешено компилировать и выполнять плохо сформированные программы. Поэтому в этом случае я предполагаю, что тот факт, что символьный литерал по-прежнему имеет значение, имеет значение.)
Других решений пока нет …