现代 C++
从 C++11/14 到 C++20,再到模板与并发模型的演进脉络。
-
现代 C++(五):内存模型、atomic、thread 与 future
C++11 之前没有语言级内存模型,多线程代码在编译器 + CPU 双重乱序下不可能正确(Hans Boehm 2005 论文证明)。C++11 一次性引入内存模型、std::atomic、std::thread、std::future 四件套,给了 C++ 官方并发语义。六种 memory order 是理解的核心——在 x86 上 release/acquire 几乎免费、seq_cst 要 mfence,在 ARM 上差距更大,这正是暴露细粒度 order 的意义。
-
现代 C++(四):模板元编程从 SFINAE 到 Concepts
C++ 模板元编程(TMP)的本质是把编译器当成纯函数式解释器:类型是值、模板是函数、偏特化是模式匹配。SFINAE 是语言规则的副作用被滥用成约束机制的历史遗留,C++17 if constexpr + C++20 Concepts 把"编译期分支"和"约束表达"从巫术升级为一等公民,错误信息从 200 行模板栈变成一行说明。业务代码 95% 用不到深度 TMP,但读标准库和调试模板错误必须看得懂。
-
现代 C++(三):Concepts、Ranges、Coroutines、Modules 如何重定义 C++
C++20 是继 C++11 之后最大的一次升级,核心是四个范式级特性同时落地:Concepts 把模板错误从 200 行报错变成一行说明,Ranges 用惰性 view + 管道语法重构了整个 STL 算法接口,Coroutines 让异步代码写得像同步(但标准库没给 Task,需要三方库),Modules 终于告别了头文件——每一个单独拎出来都足以改变一整类编程风格。
-
现代 C++(二):if constexpr、optional 与 variant 如何降低认知负担
C++17 不是革命而是善后——它把 Boost.Optional/Variant/Any/Filesystem/string_view 吸收进标准库,用 if constexpr 和折叠表达式干掉 SFINAE 地狱,用结构化绑定消除 std::tie 的笨重,用 CTAD 让模板参数不再冗余;日常业务代码的认知负载一次性大幅下降,是应届生和资深的分水岭。