Почему имена underscore зарезервированы для реализации UDL, а не наоборот?

Я знаю, что это старая функция, но читаемая на пользовательских литералах, например.

return_t operator "" _a(long); // Literal operator for user-defined INTEGRAL literal

Мне напомнили, что

требуется верхнее подчеркивание. (Только стандартная библиотека может определять литералы без подчеркивания.) (A)

Это, похоже, нарушает шаблон, поскольку до сих пор реализация работала с именами underscorey и оставила нам хорошие, например зарезервированные для реализации, имена, которые

  • Содержит двойной символ подчеркивания
  • Начните с символа подчеркивания, за которым следует заглавная буква

Кроме того, цитата (A) несколько опасна при наличии правила (2). Итак, почему непоследовательность?

Ответ 1

До того, как идея пользовательских литералов была добавлена ​​к языку, все стандартные литералы использовали последовательности, которые не начинаются с подчеркивания, например 123L для long int литерала. Поэтому для обеспечения согласованности стандартные литералы получают пространство имен без какого-либо специального префикса, а UDL отличаются от них с помощью _.