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-suffix 在 user-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。
在最近的一次代码审查中,我遇到了以下问题:
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-suffix 在 user-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。