0

0

C++中的用户定义字面量(UDL)怎么写?C++自定义后缀语法【C++11】

尼克

尼克

发布时间:2025-12-26 10:46:02

|

501人浏览过

|

来源于php中文网

原创

用户定义字面量(UDL)是C++11引入的特性,通过operator""_后缀形式在全局或命名空间中定义以下划线开头的自定义后缀函数,支持整数、浮点、字符串、字符等字面量类型,实现类型安全与可读性提升。

c++中的用户定义字面量(udl)怎么写?c++自定义后缀语法【c++11】

用户定义字面量(User-Defined Literals,UDL)是 C++11 引入的特性,允许你为字面量添加自定义后缀(比如 123_km"hello"_s),并绑定到一个特殊的 operator 函数上,从而实现类型安全、可读性强的字面量构造。

基本语法:operator "" 后缀名

UDL 的声明形式固定为:operator "" _后缀名,必须在全局作用域或命名空间内定义,不能是成员函数。后缀名必须以下划线开头(如 _km_s),这是强制规定,避免与标准库或未来标准冲突。

它不是重载运算符,而是一个独立的函数名;编译器在遇到 值_后缀 时,会尝试匹配对应参数类型的 operator "" _后缀 函数。

支持的参数类型和常见用法

UDL 函数的参数取决于字面量类型,编译器会自动传递解析后的值或字符序列:

立即学习C++免费学习笔记(深入)”;

Outwrite
Outwrite

AI写作浏览器插件,将您的想法变成有力的句子

下载
  • 整数字面量(如 42_km)→ 参数为 unsigned long long
  • 浮点字面量(如 3.14_rad)→ 参数为 long double
  • 字符串字面量(如 "abc"_s)→ 参数为 const char* + std::size_t(长度)
  • 字符字面量(如 'x'_tag)→ 参数为 charwchar_t 等单个字符类型

示例:定义一个把千米转成米的 UDL:

constexpr int operator"" _km(unsigned long long val) {
    return static_cast(val * 1000);
}
// 使用:auto d = 5_km; // d == 5000

字符串 UDL:支持编译期处理(C++14 起更友好)

字符串字面量 UDL 接收 const char* 和长度,但原始字符数组不保证空终止,且 C++11 中无法直接用 constexpr 处理变长字符串。常用技巧是包装成 std::string_view(C++17)或自定义字符串类。

C++14 起允许字面量运算符模板,支持任意长度字符串的编译期解析(需配合字符数组模板参数):

template
constexpr auto operator"" _sv() {
    return std::integer_sequence{};
}
// 更实用的写法(C++17):
constexpr std::string_view operator"" _sv(const char* s, size_t n) {
    return std::string_view{s, n};
}
// 使用:"hello"_sv → string_view,零开销

注意事项和限制

  • 后缀名必须以下划线开头,否则编译错误
  • 不能定义在类内部;不能是 static 或 inline(除非 C++17 允许 inline constexpr UDL)
  • 函数必须有返回值,且不能是 void
  • 若多个 UDL 匹配(如同时定义了 intlong long 版本),编译器按字面量类型精确匹配,不进行隐式转换
  • 推荐使用 constexpr,便于编译期计算和优化

基本上就这些。写 UDL 的关键是选对参数类型、加好下划线、返回有意义的类型——它不是炫技工具,而是提升接口清晰度和类型安全的实用机制。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

69

2025.10.17

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

516

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.8万人学习

ASP 教程
ASP 教程

共34课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号