C++中仅为单个下划线的用户自定义字面量(UDL)后缀是否符合标准?
结论:该写法属于未定义行为,C++标准不允许使用单个下划线作为用户自定义字面量(UDL)后缀
首先明确两个相关标准条款的适用边界:
17.6.4.3.2 [global.names]:全局命名空间中所有以下划线开头的名称均为实现保留名称。
17.6.4.3.5 [usrlit.suffix]:不以下划线开头的字面量后缀标识符保留给未来标准化使用。
- [usrlit.suffix]的规则仅豁免了「下划线开头的UDL后缀被标准预留」的限制,即用户自定义的UDL后缀必须以下划线开头才不会和未来标准新增的后缀冲突,但该条款没有豁免全局命名空间的标识符保留规则。
- 单个下划线
_本身属于全局命名空间中被实现保留的标识符,完全符合[global.names]的约束条件,没有被UDL相关规则排除在外。 - 合法的用户自定义UDL后缀必须满足「下划线 + 至少一个其他合法标识符字符」的格式,例如
_dim、_px这类后缀才是标准允许的写法。
问题中给出的代码:
constexpr Dimensionless operator"" _(...) {}
以及对应的用法42_都违反了标识符保留规则,属于未定义行为,不建议在生产代码中使用。
内容的提问来源于stack exchange,提问作者David Brown
相关产品推荐
相关产品推荐

