
现代 C++
文章平均质量分 93
从 C++ 98 到最新 C++ 标准的演化,现代 C++ 的语言规范、习语(惯用法),与 C++ 有关的一切
王晓华-吹泡泡的小猫
20+ 软件领域从业经验,关注软件开发团队能力提升和敏捷开发,目前全职从事软件相关的培训、授课和咨询
展开
-
C++ 的 if-constexpr
if-constexpr 语法是 C++ 17 引入的新语法特性,也被称为常量 if 表达式或静态 if(static if)。引入这个语言特性的目的是将 C++ 在编译期计算和求值的能力进一步扩展,更方便地实现编译期的分支选择动作。原创 2025-03-24 11:21:11 · 1090 阅读 · 0 评论 -
C++ override 说明符
override和final作为说明符号,并不是保留的 C++ 关键字,它们只在它们能起作用的地方起说明作用,如果在其他地方出现,它们和普通的符号没有区别原创 2025-03-18 10:31:28 · 318 阅读 · 0 评论 -
C++ 11 的返回值类型后置语法
C++ 11 引入了一种新的语法形式,就是返回值类型后置(trailing-return-type)语法,也被称为跟踪返回值类型语法或后置返回值类型。原创 2025-03-14 11:28:34 · 775 阅读 · 0 评论 -
C++ 的位域(BitFields)
位域的定义使用 struct 关键字,但是和定义 struct 不同的是,它需要为每个分量(属性)指定长度,但是每个分量可以和数据结构中其他正常的元素一样使用和初始化。原创 2025-03-12 09:37:11 · 1044 阅读 · 0 评论 -
C++ 的时间库之八:format 与格式化
在《C++ 的时间库之五:time_point》和《C++ 的时间库之三:Duration》两篇文章中,我们增补了关于字符串格式化输入和输出的内容,但是因为篇幅关系,没有展开详细介绍相关的格式支持,所以本篇的目的就是全面介绍 format 库对时间库的格式化支持。原创 2025-03-10 09:50:28 · 983 阅读 · 0 评论 -
C++ 的时间库之七:自定义时钟
chrono 库定义了很多时钟,仿照这些时钟的实现代码做一个自定义的 clock 非常简单。原创 2025-03-04 12:50:10 · 907 阅读 · 0 评论 -
C++ 的时间库之六:日历和时区
C++ 11 的时间库提供了各种时钟、时间点以及时间间隔的计算与表达,但是却没有提供日期相关的类型,也没有提供与时区有关的本地时间转换等支持组件,所以用起来不是很顺手。直到 C++ 20 终于补齐了这块短板,时间库具备是时间、日期和时区的完整支持原创 2025-02-27 10:38:41 · 813 阅读 · 0 评论 -
C++ 的时间库之五:time_point
C++ 的时间点有两个关键标识,一个是时间点计时用的时钟类型,另一个是记录时间点从时钟的纪元起点开始的时间间隔类型。时钟类型决定了时间点的计时方式和时间纪元起点,时间间隔类型决定这个时间点的计时单元是毫秒还是天。原创 2025-02-26 09:28:12 · 920 阅读 · 0 评论 -
C++ 的时间库之四:Clock
除了时间纪元的起点不同,不同的系统内时间间隔的计数精度也不一样,这就造成了计算机系统中时间记录方式的差异。为了区分这种差异,C++ 11 开始引入了系统时钟类型的概念,不同的时钟,对时间的理解和计算也不一样。原创 2025-02-25 10:43:39 · 570 阅读 · 0 评论 -
C++ 的时间库之三:Duration
C++ 的时间库主要有三部分组成,分别是时钟类型、时间点和时间间隔。时钟类型决定了计时方式,时间纪元的起点,时间间隔用于记录一段持续时间的长短,时间点是一种时钟类型在某个时间点的计数。时间间隔与时钟类型无关,也相对简单,所以先介绍一下时间间隔。原创 2025-02-24 10:37:01 · 646 阅读 · 0 评论 -
C++ 的时间库之二:Ratio
从现在开始,我们开始介绍 C++ 风格的时间处理,在这之前,首先要介绍 std::ratio。因为 C++ 的 `chrono`库中的时间段(duration)定义离不开ratio,不了解 ratio,就很难理解duration 的定义。原创 2025-02-18 11:21:13 · 874 阅读 · 0 评论 -
C++ 的时间库之一:C 语言传统
在 C++ 11 标准之前,C++ 的代码在处理跟时间有关的内容时,沿用的是 C 语言的库。C++ 11 引入了 chrono 库,经过 C++ 17 和 C++ 20 的补充,现在的 chrono 库已经完善。但是在介绍 C++ 的 chrono 库之前,了解一下 C 语言的时间处理方法是十分必要原创 2025-02-14 13:55:51 · 1945 阅读 · 0 评论 -
C++ 的 get 和 get_if
介绍 std::get 和 std::get_if 函数,以及如何让自定义对象支持这两个函数原创 2025-02-13 15:48:39 · 1072 阅读 · 0 评论 -
C++ 的 visit 函数
std::visit() 函数是 C++17 引入的一个得力工具,它可以让你针对一个 std::variant 的当前活动类型调用与之匹配的函数,换言之,它可以基于 std::variant 的实际活动类型完成一些函数分派(Dispatch)动作原创 2025-02-11 13:16:36 · 1476 阅读 · 0 评论 -
C++ 17 的 std::byte 类型
在大多数平台上,字节(也被称为 8 位组),是计算机程序存储数据的基本单位。但是不幸的是,C++ 一直没有字节类型。有人会问 char 不是吗?char 还真不是,它是一个字符类型,在 C++ 的世界里一直被认为是整型数的一种,只是在大多数系统中恰好也是 8 个比特位而已。原创 2025-02-10 14:51:53 · 1046 阅读 · 0 评论 -
C++ 23 的栈踪迹库(stacktrace)
许多编程语言都提供调用栈踪迹回溯的功能,在错误发生的时候,除了报告错误发生的位置,还能输出函数调用栈信息。现在,C++ 也有自己的栈踪迹库了原创 2025-02-08 16:35:27 · 1007 阅读 · 0 评论 -
C++ 的 CTAD 与推断指示(Deduction Guides)
类模板参数推导(Class Template Argument Deduction),C++ 20 对聚合类型的支持以及显示推断指示原创 2025-01-16 15:27:07 · 1078 阅读 · 0 评论 -
C++ 的 pair 和 tuple
C++ 的 pair 和 tuple 在 C++ 标准中的演化原创 2025-01-10 13:07:47 · 1224 阅读 · 0 评论 -
现代 C++ new 和 delete 的演化
现代 C++ new 和 delete 从 C++ 11 到 20 的演化原创 2025-01-08 10:41:43 · 1037 阅读 · 0 评论 -
C++ 的 error_code 之三:自定义 error_condition
以访问被拒绝错误为例,Windows 系统上的设备驱动会返回 0xC0000005,而 Linux 系统上的设备驱动会返回 13。支持库要求同时支持两种操作系统,希望提供一种与设备无关的错误码定义,让支持库不需要根据操作系统的差异用两套代码判断错误码,这种情况就需要使用自定义的 error_condition。原创 2025-01-03 09:32:50 · 930 阅读 · 0 评论 -
C++ 的 error_code 之二:自定义 error_code
回答第一部分遗留的问题,std::errc 枚举值怎么就成了 error_condition 常量?上面这行代码背后是什么原理呢?原创 2025-01-02 10:47:37 · 675 阅读 · 0 评论 -
C++ 的 format_to 和 format_to_n 函数
std::format_to() 和 std::format_to_n() 则提供了对应的迭代器版本原创 2024-12-31 10:31:58 · 512 阅读 · 0 评论 -
C++ 的 error_code 之一:基本概念
有一些人将错误码机制和异常处理机制对立起来,认为是两种互斥的错误处理逻辑,其实这是不对的。首先,并不是所有的错误都是异常或以异常的形式出现,其次,异常中的错误信息也可以用错误码来表示。所以使用错误码和使用异常并不矛盾原创 2024-12-30 11:05:08 · 1005 阅读 · 0 评论 -
C++ 的 source_location
__FILE__ 和 __LINE__ 在输出日志和调试信息方面扮演重要的角色,现在,C++ 有了 source_location,提供更好的编程体验。原创 2024-12-27 11:15:18 · 690 阅读 · 0 评论 -
C++ 23 的 print 和 println
你肯定已经厌倦了 C++ 裹脚布般冗长的流式输出控制,但是又对 C 的 printf 的“安全性”心存芥蒂,每当需要格式化输出一些东西的时候,就有种百爪挠心的感觉。现在,不用再挠了,C++ 终于有自己的 print() 函数了。原创 2024-12-27 11:04:40 · 1095 阅读 · 0 评论 -
C++ 的 format 函数支持自定义类型
format() 对各种数据类型的格式化支持是通过提供 std::formatter 特化版本实现的,扩展 std::formatter 的方法有两种,一种是通过继承方式,从已经存在的 std::formatter 版本派生新的 std::formatter 特化类,另一种是实现一个完整的 std::formatter 特化版本原创 2024-12-27 11:01:03 · 1197 阅读 · 0 评论 -
C++ 的衰退复制(decay-copy)
要理解为什么 C++ 会有衰退复制(decay-copy)这个需求,需要了解一下 LWG issue 929 问题的提出,但是要理解这个 issue,最好先复习一下 C++ 模板参数的推导规则。原创 2024-12-25 12:03:34 · 1507 阅读 · 0 评论 -
C++ 基于范围的 for 循环与版本演化
介绍基于范围的 for 循环语法糖从 C++ 11 到 26 的演化,以及如何让自定义对象也支持基于范围的 for 循环原创 2024-12-20 15:34:10 · 762 阅读 · 0 评论 -
C++ 的 format 和 vformat 函数
介绍 C++ 20 引入的 format 和 vformat 函数,以及 C++ 23 和 26 的持续改进内容原创 2024-12-18 12:45:47 · 1587 阅读 · 0 评论 -
C++ 的“结构化绑定(Structured Binding)”
C++ 引入了 std::pair 和 std::tuple,可以很方便地定义一些轻量化的数据类型。但是 std::pair 和 std::tuple 的使用也引入了一些问题,最主要的就是代码可读性的下降原创 2024-10-21 10:37:25 · 598 阅读 · 0 评论 -
C++ 11 的 codecvt 与编码转换
乱码,是程序员最头疼的事儿,处理不同系统的文件,或者使用不兼容的第三方库,只要是程序规模大一点,几乎都会遇到乱码问题。乱码说白了,就是编码与解码不匹配,既然不匹配那就得做编码转换,本文就来聊聊编码转换这点事儿。原创 2024-10-16 11:19:34 · 903 阅读 · 0 评论 -
C++ 的僵尸标识符(Zombie identifiers)(截止 C++23)
C++ 11 开始引入大量新的语言特性,同时大量旧的内容被淘汰。C++ 版本迭代如此之快,以至于有些内容都还没有见过就已经被淘汰了。正所谓步子迈的太大容易那个什么的,以至于出现了 C++ 11 才引入的内容就在 C++ 17 被删除这样“惨绝人寰”的事情原创 2024-10-15 10:19:47 · 632 阅读 · 0 评论 -
C++ 的存储类型与新的 thread_local
存储周期只是一个概念,是程序语义范畴内的东西,但不是语法的范畴。存储类型说明符也被称为存储类型,它们是变量声明语法中类型说明符的一部分,它们和变量名的范围一起控制变量的两个独立属性,即存储周期和链接属性。原创 2024-10-14 12:36:47 · 747 阅读 · 0 评论 -
C++ 的用户自定义字面量
C++ 支持用户自定义的字面量标识符,允许用户对整数、浮点数、字符和字符串类型的立即数提供针对用户自定义对象的字面量后缀。原创 2024-10-12 11:39:23 · 920 阅读 · 0 评论 -
C++ 的字面量(literal)
终于,C++ 23 决定增加一种针对 std::size_t 的字面量,整数型的立即数后加上 z 或 Z 后缀就可以标识是有符号的 std::size_t 类型字面量原创 2024-10-11 11:52:08 · 1042 阅读 · 0 评论 -
有保证的复制消除(Guaranteed Copy Elision)
新的 C++ 17 标准带来了很多令人兴奋的新特性,其中一个微小的,不易觉察的改进就是“有保证的复制消除(guaranteed copy elision)”。翻译 2022-06-02 10:10:42 · 1334 阅读 · 1 评论 -
使用 SOUI 开发高 DPI 桌面应用程序
基于传统技术开发的 Windows 桌面应用,在高分辨率的显示设备上表现得“惨不忍睹”。随着高分辨率显示设备的普及,所有桌面应用程序的开发人员,都需要关注自己的软件在不同的 DPI 上的表现。## 1 应用程序感知 DPI 变化在 Windows 2000 之前,大部分大部分开发人员对显示器分辨率的关注点是如何让自己的程序在低分辨率的显示器上表现正常,因为过低的分辨率会导致窗口界面显示不完整。随着垂直分辨率低于 768 的显示设备逐步被淘汰,为 Windows XP 和 Windows 7 开发.原创 2021-09-17 12:51:51 · 1623 阅读 · 1 评论 -
C++20,说说 Module 那点事儿
几天前,C++20 草案已经获得了标准委员会的全票通过,C++2a 草案讨论的几个重要内容,比如“概念(concept)”、“范围库(Ranges Library)”、“协程(Coroutines)” 和 “模块(Module)” 都加到 C++20 的标准中了,剩下的就是看编译器厂商的支持速度了。目前看 CLANG 、GCC 和 Microsoft 是比较积极的三家,语言特性和库支持的最快的是 GCC,其次是 CLANG 和 Visual C++,估计最快到年底就能看到支持全部 C++ 20 特性的编译器原创 2020-09-19 14:32:46 · 3549 阅读 · 0 评论