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