用户可通过下划线开头的自定义后缀定义字面量操作符,提升代码可读性与类型安全;需重载long double与unsigned long long版本,推荐使用constexpr,避免命名冲突。

在C++11及以后的标准中,用户可以通过定义字面量操作符来自定义字面量后缀,从而实现更直观、类型安全的常量表示方式。这种方式常用于时间、长度、货币等场景,提升代码可读性和类型安全性。
基本语法与规则
用户定义字面量通过在字面量后添加自定义后缀来触发特定函数。定义格式如下:
operator"" _suffix(参数)其中 _suffix 是你自定义的后缀名,参数类型决定字面量的原始类型:
- 整数字面量 → unsigned long long
- 浮点字面量 → long double
- 字符字面量 → const char* + 长度
- 字符串字面量 → const char* + 长度
- 原始用户定义字面量 → 接收字符串形式(C++14起)
示例:定义时间单位
假设我们想用 s 表示秒,ms 表示毫秒,并自动转换为一个Time类:
立即学习“C++免费学习笔记(深入)”;
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
#include iostream>
class Time {
double milliseconds_;
public:
constexpr Time(double ms) : milliseconds_(ms) {}
double toSeconds() const { return milliseconds_ / 1000; }
void print() const { std::cout
};
// 定义秒的字面量
constexpr Time operator"" _s(long double seconds) {
return Time(seconds 1000);
}
constexpr Time operator"" _s(unsigned long long seconds) {
return Time(seconds 1000);
}
// 定义毫秒的字面量
constexpr Time operator"" _ms(long double ms) {
return Time(ms);
}
constexpr Time operator"" _ms(unsigned long long ms) {
return Time(ms);
}
使用示例:
int main() {
auto t1 = 5.5_s; // 5.5秒 → 5500ms
auto t2 = 200_ms; // 200毫秒
t1.print(); // 输出: 5500 ms
t2.print(); // 输出: 200 ms
return 0;
}
其他常见用途
用户定义字面量可用于多种场景:
-
长度单位:如
12.5_km
,3_m
-
字符串包装:如
"hello"_safe
自动构造安全字符串类型 -
复数:如
3.0+4.0i
(标准库已支持) -
二进制字面量扩展:C++14支持
0b1010
,也可自定义如1010_b
注意事项
使用用户定义字面量时需注意:
- 后缀名必须以下划线开头,避免与标准后缀冲突(如
_s
合法,s
非法) - 若需要支持浮点和整数,必须重载 long double 和 unsigned long long 两个版本
- 尽可能使用 constexpr,使字面量可在编译期计算
- 避免与标准库或第三方库的后缀命名冲突
基本上就这些。自定义字面量虽小,但能显著提升代码表达力和类型安全。合理使用,可让接口更直观。








