C++: определяемые реализацией принятые символы физического исходного файла
Согласно стандарту C++14,
§2.2.1.1 [...] Набор принятых физических символов исходного файла определяется реализацией. [...] Любой символ исходного файла, не входящий в базовый исходный набор символов, заменяется универсальным именем символа, которое обозначает этот символ. [...]
Означает ли это, что стандарт C++ не дает определенной или условно поддерживаемой поддержки символов, отличных от UCS/Unicode? Например, физическая исходная кодировка файла, включающая символы без соответствующей кодовой точки UCS.
Единственное, о чем я могу думать, это то, что если бы это было так (компилятор поддерживает символы не-UCS посредством кодировок не-UCS), компилятору пришлось бы использовать частные диапазоны UCS для отображения этих физических символов, но в любом случае это решение не подходит для части "универсальное имя символа, которое обозначает этот символ", потому что кодовые точки UCS внутри закрытых диапазонов вообще не определяют никакого конкретного символа.
1 ответ
На самом деле, нет., Вид. Важная часть цитаты IMO [lex.phases] заключается в следующем:
[...] Физические символы исходного файла отображаются в основной исходный набор символов
Поддерживается только базовый исходный набор символов, все остальное должно как-то отображаться на него ([lex.charset]):
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
Но в стандарте также сказано, что он должен делать это при необходимости. Далее говорится следующее:
Допустимый набор физических символов исходного файла определяется реализацией.
Так что я полагаю, что это позволяет компилятору в конце концов делать все, что он хочет, при условии, что он хотя бы поддерживает базовый набор символов.