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

Why are non underscore names reserved to the implementation for UDL and not the other way around?

我知道这是一个旧功能,但请继续阅读 user defined literals 例如

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

有人提醒我

the leading underscore is required. (Only the Standard Library is allowed to define literals without the underscore.) (A)

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

  1. 包含双下划线
  2. 以下划线开头,后跟大写字母

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

在 user-defined 字面量的概念被添加到语言之前,所有标准字面量都使用不以下划线开头的序列,例如 123L 表示 long int 字面量.所以为了保持一致性,标准字面量获取的命名空间没有任何特殊前缀,UDLs通过使用_.

来与它们区分开来