0

0

c++用户定义字面量 c++ UDL使用方法【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-27 14:10:03

|

645人浏览过

|

来源于php中文网

原创

用户定义字面量(UDL)是C++11引入的编译期隐式转换机制,通过operator""_suffix函数实现,支持整数、浮点、字符串、字符及宽字符五种形式,需在命名空间中定义且后缀为合法标识符;C++14起可为constexpr,用于编译期计算与类型安全封装。

c++用户定义字面量 c++ udl使用方法【详解】

用户定义字面量(User-Defined Literals,UDL)是 C++11 引入的特性,允许程序员为自定义类型提供直观、类型安全的字面量语法,比如 123_km"hello"_s3.14159_rad。它不是宏或函数调用,而是编译期绑定的隐式转换机制,关键在于“下划线 + 后缀”的形式必须合法且不与标准字面量冲突。

UDL 的基本语法和声明规则

UDL 本质是一个特殊的 operator"" 函数,后缀名必须是合法标识符(不能是纯数字、不能含特殊符号,如 operator""_m 合法,operator""_123operator""_$ 非法)。支持五种参数形式:

  • 整数字面量:形如 operator""_x(unsigned long long),适用于 42_x
  • 浮点字面量:形如 operator""_f(long double),适用于 3.14_f
  • 字符串字面量(C 风格):形如 operator""_s(const char*, size_t),适用于 "abc"_s
  • 字符字面量:形如 operator""_c(char),适用于 'a'_c
  • 宽字符/UTF 字面量:类似上一条,但参数类型为 wchar_tchar16_tchar32_t

注意:UDL 函数必须在命名空间作用域中定义(不能在类内),且不能是模板(C++11/C++14),C++17 起允许 constexpr 模板形式(需满足常量表达式约束)。

常见实用场景与写法示例

UDL 最有价值的地方是提升领域代码可读性与安全性,避免魔数和隐式转换错误。

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

Shell脚本编写基础 中文WORD版
Shell脚本编写基础 中文WORD版

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统

下载
  • 单位封装:定义长度、时间、质量等带单位的数值类型
      struct Distance { double m; constexpr Distance(double v) : m(v) {} };
      constexpr Distance operator"" _km(long double x) { return Distance{static_cast(x) * 1000}; }
      auto d = 5.5_km; // 类型明确,自动转为米
  • 字符串视图速建:避免临时 std::string 构造开销
      constexpr std::string_view operator"" _sv(const char* s, size_t n) { return {s, n}; }
      auto sv = "hello"_sv; // 类型是 string_view,零拷贝
  • 正则或格式字符串标记:配合编译期检查工具(如 Boost.YAP 或 future C++23 regex constexpr)
      struct Regex { const char* p; };
      constexpr Regex operator"" _re(const char* s, size_t) { return {s}; }
      auto r = R"(a+b+)"_re;

注意事项与限制

UDL 看似灵活,但误用易引发歧义或编译失败。

  • 后缀名若与标准库或第三方库冲突(如 _s 在 C++20 中已用于秒),应加命名空间限定或换名(如 _sec
  • 字符串 UDL 的 const char* 参数指向的是字面量存储区,生命周期永久,但不可修改;若需处理转义或编译期解析,需用 C++14 起的 constexpr 字符串处理技巧
  • 整数/浮点 UDL 接收的是字面量原始值(无符号长整、长双精度),不保留原字面量格式(如进制、小数位数),因此无法区分 0xFF255
  • 不能重载已有标准后缀(如 _z_i_ll),也不能定义空后缀(operator"" "" 不合法)

与字面量常量表达式的结合

C++14 起,UDL 函数可声明为 constexpr,使其参与编译期计算。例如:

  • 定义角度转弧度的 constexpr UDL:
      constexpr double operator"" _deg(long double deg) { return deg * 3.14159265358979323846 / 180.0; }
      constexpr auto a = 90.0_deg; // 编译期求值,可用作数组大小、模板参数等
  • 搭配 std::arraystd::integral_constant 实现类型级配置,例如 42_b 表示 42 位宽整数类型选择器

只要函数体满足 constexpr 约束(无动态内存、无副作用、仅调用 constexpr 函数等),就能获得编译期能力。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

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

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

1428

2023.10.24

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

268

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

250

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

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

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

517

2023.09.20

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

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

246

2023.08.03

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

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

精品课程

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

共58课时 | 3万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.8万人学习

ASP 教程
ASP 教程

共34课时 | 2.9万人学习

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

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