Почему имена underscore зарезервированы для реализации UDL, а не наоборот?
Я знаю, что это старая функция, но читаемая на пользовательских литералах, например.
return_t operator "" _a(long); // Literal operator for user-defined INTEGRAL literal
Мне напомнили, что
требуется верхнее подчеркивание. (Только стандартная библиотека может определять литералы без подчеркивания.) (A)
Это, похоже, нарушает шаблон, поскольку до сих пор реализация работала с именами underscorey и оставила нам хорошие, например зарезервированные для реализации, имена, которые
- Содержит двойной символ подчеркивания
- Начните с символа подчеркивания, за которым следует заглавная буква
Кроме того, цитата (A) несколько опасна при наличии правила (2). Итак, почему непоследовательность?
Ответы
Ответ 1
До того, как идея пользовательских литералов была добавлена к языку, все стандартные литералы использовали последовательности, которые не начинаются с подчеркивания, например 123L
для long int
литерала. Поэтому для обеспечения согласованности стандартные литералы получают пространство имен без какого-либо специального префикса, а UDL отличаются от них с помощью _
.