用户定义字面量 UDL
更新时间:2026-10-01。配合 20 chrono,
100ms就是字面量运算符的产物。
一、形式
cpp
constexpr Mass operator""_kg(long double x){ return Mass(x*1000); }
auto m = 2.5_kg;
using namespace std::string_literals; auto s = "hi"s; // std::string数值接收 unsigned long long/long double,字符串接收 const char*, size_t,字符可用模板参数包做编译期处理。
二、规则
必须以下划线开头(无下划线保留标准库,声明它们是非标准/UB);可用 constexpr 实现编译期单位换算,避免运行时错误单位。

常见坑
- 忘记下划线或与标准后缀冲突。
- 宏展开干扰含字面量的代码。
- 后缀写在复杂表达式上时优先级歧义,加括号。
小结
总结
用户定义字面量用 operator""_x 给字面量附加一个类型,从而写出 100ms、2.5_kg、"hi"s 这种自带单位、类型安全的写法,数值型接收 unsigned long long/long double、字符串型接收 const char*,size_t、字符还可用模板参数包做编译期处理;关键规则是后缀必须以下划线开头(无下划线保留给标准库,自行声明属非标准/UB),配合 constexpr 可把单位换算提前到编译期、从根上消灭单位用错,注意命名冲突、后缀优先级歧义要加括号,以及宏对字面量代码的干扰。