用户定义字面量是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) {}
};
<p>Distance operator"" _km(long double x) {
return Distance(static_cast<double>(x));
}</p><p>Distance operator"" _mi(long double x) {
return Distance(static_cast<double>(x) * 1.609344); // 英里转公里
}</p><p>// 使用
auto d1 = 5.5_km; // Distance{5.5}
auto d2 = 10.0_mi; // Distance{16.09344}
适用于需要在编译期解析字符串的场景(如自定义字符串视图、正则编译、单位解析等)。注意:C++14 起支持 constexpr 字符串字面量运算符,但需满足常量表达式约束。
立即学习“C++免费学习笔记(深入)”;
// C++14 起可写 constexpr 版本(简化版)
#include <string_view>
<p>constexpr std::string_view operator"" _sv(const char* s, size_t len) {
return std::string_view{s, len};
}</p><p>auto sv = "hello"_sv; // 类型是 std::string_view,零开销
_ 开头(如 _m、_sec),标准库保留无下划线后缀(如 s、h 是 <chrono></chrono> 里合法的,但你自己不能定义 operator"" s)123 的含义,只能加后缀)constexpr 字符串处理技巧)int、std::chrono::seconds 等std::chrono 和 std::complex
C++ 标准库已用该机制实现了时间字面量(需包含 <chrono></chrono>):
using namespace std::literals; auto t = 5s + 200ms; // std::chrono::seconds + milliseconds auto z = 3.0 + 4.0i; // C++14 起,operator"" i 定义了 std::complex<double>
你也可以模仿写出 operator"" _dB(分贝换算)、operator"" _deg(角度转弧度)等,提升数值代码可读性。
基本上就这些。写起来不复杂,关键是选好后缀名、明确参数类型、返回有意义的类型——它让字面量自带语义,代码更安全也更易懂。
以上就是c++++中的用户定义字面量(User-defined Literals)怎么用_c++自定义后缀【C++11】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号