用户定义字面量是C++11引入的特性,通过operator””后缀函数将带自定义后缀的字面量(如123_km、3.14_rad、“hello”_sv)转换为指定类型或执行逻辑,提升代码语义性与安全性。

用户定义字面量(User-defined Literals)是 C++11 引入的特性,允许你为字面量添加自定义后缀,从而让编译器在编译期或运行期将其转换为自定义类型或执行特定逻辑。核心是通过定义特殊的 字面量运算符函数(literal operator),比如 operator"" _km。
基本语法:定义一个后缀函数
必须以 operator"" 开头,后面紧跟自定义后缀名(如 _s、_mb、_deg),函数参数取决于字面量类型:
整数字面量(如 123_km)→ 参数为 unsigned long long浮点字面量(如 3.14_rad)→ 参数为 long double字符/字符串字面量(如 "hello"_sv)→ 参数为 const char* 和 size_t单个字符(如 'a'_tag)→ 参数为 char
示例:定义距离单位后缀 _km 和 _mi
struct Distance { double km; Distance(double k) : km(k) {}};Distance operator"" _km(long double x) {return Distance(static_cast(x));}
Distance operator"" _mi(long double x) {return Distance(static_cast(x) * 1.609344); // 英里转公里}
// 使用auto d1 = 5.5_km; // Distance{5.5}auto d2 = 10.0_mi; // Distance{16.09344}
字符串字面量后缀:支持编译期字符串处理
适用于需要在编译期解析字符串的场景(如自定义字符串视图、正则编译、单位解析等)。注意:C++14 起支持 constexpr 字符串字面量运算符,但需满足常量表达式约束。
立即学习“C++免费学习笔记(深入)”;
// C++14 起可写 constexpr 版本(简化版)#includeconstexpr std::string_view operator"" _sv(const char* s, size_t len) {return std::string_view{s, len};}
auto sv = "hello"_sv; // 类型是 std::string_view,零开销
注意事项和限制
后缀名必须以下划线 _ 开头(如 _m、_sec),标准库保留无下划线后缀(如 s、h 是 里合法的,但你自己不能定义 operator"" s)不能重载已有的字面量行为(比如不能改 123 的含义,只能加后缀)函数必须在命名空间作用域(不能在类内)、不能是模板(除非是变量模板 + C++14 后的 constexpr 字符串处理技巧)整数/浮点后缀函数返回类型可以是任意类型,不强制是类——也可以返回 int、std::chrono::seconds 等
实用小技巧:结合 std::chrono 和 std::complex
C++ 标准库已用该机制实现了时间字面量(需包含 ):
using namespace std::literals;auto t = 5s + 200ms; // std::chrono::seconds + millisecondsauto z = 3.0 + 4.0i; // C++14 起,operator"" i 定义了 std::complex
你也可以模仿写出 operator"" _dB(分贝换算)、operator"" _deg(角度转弧度)等,提升数值代码可读性。
基本上就这些。写起来不复杂,关键是选好后缀名、明确参数类型、返回有意义的类型——它让字面量自带语义,代码更安全也更易懂。
以上就是c++++中的用户定义字面量(User-defined Literals)怎么用_c++自定义后缀【C++11】的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488521.html
微信扫一扫
支付宝扫一扫