为什么非下划线名称保留给UDL的实现而不是相反?

Lor*_*ins 10 c++ user-defined-literals

我知道这是一个古老的功能,但阅读用户定义的文字,例如

return_t operator "" _a(long); // Literal operator for user-defined INTEGRAL literal
Run Code Online (Sandbox Code Playgroud)

我被提醒了

领先的下划线是必需的.(只允许标准库定义没有下划线的文字.)(A)

这似乎打破了模式,因为到目前为止,实现与下划线名称一起使用并留给我们好的,例如保留给实现的名称

  1. 包含双下划线
  2. 首先是下划线,后跟大写字母

此外,在存在规则(2)的情况下,引用(A)有些危险.那么为什么不一致呢?

Bar*_*mar 8

用户自定义文字的想法加入到语言之前,所有的标准文字使用不带下划线开始序列,如123L一个long int文字.因此,为了保持一致性,标准文字获取没有任何特殊前缀的命名空间,并且通过使用将UDL与它们区分开来_.