C++ 中的用户定义文字命名

User Defined Literal naming in C++

在最近的一次代码审查中,我遇到了以下问题:

constexpr Dimensionless operator"" _(...) {}

在我阅读标准时,我无法判断这是 UB、未指定行为还是未指定行为。

17.6.4.3.2 [global.names]我们知道:

Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

并且从 17.6.4.3.5 [usrlit.suffix] 我们知道 UDL 被豁免:

Literal suffix identifiers that do not start with an underscore are reserved for future standardization.

我的问题是:

标准是否允许 下划线 (42_) 的文字?

Does the standard allow for a literal that is only an underscore (42_)?

是的。


根据 [lex.ext] 用户定义文字 的语法,对于所有用户定义文字系列,是:

<family-specific grammar> ud-suffix

ud-suffix:
    identifier

[over.literal]/1 描述了 ud-suffixuser-defined-string-literal 上下文中的限制:小号:

[...] The ud-suffix of the user-defined-string-literal or the identifier in a literal-operator-id is called a literal suffix identifier. Some literal suffix identifiers are reserved for future standardization; see [usrlit.suffix].

[usrlit.suffix]/1 突出显示 ud 后缀 必须 和下划线开头:

Literal suffix identifiers that do not start with an underscore are reserved for future standardization.

但是,这不会拒绝仅是下划线的 ud 后缀

[lex.ext]/3, /4 and /6 包含非字符串用户定义文字的唯一措辞,none 拒绝仅是下划线的 ud-suffix