其他
在编写或现代化 C++ 代码时,用现代…
适用于编写新 C++ 代码、现代化 pre-C++20 代码或处理安全关键 C++ 时采纳现代惯用法和编译器加固。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 55/100 ×0.15
适用场景
在编写或现代化 C++ 代码时,用现代 通用
解决思路
- 写新 C++ 代码时默认使用现代惯用法(C++20/23),并选择编译器支持的最新标准。
- 现代化现有代码时从 Tier 1(C++20/23)替换开始,按安全影响排序:内存 > 类型 > 风格。
- 安全关键代码启用编译器加固标志,启用 hardened libc++ 模式,并在 CI 运行 sanitizers。
- 使用 C++26 特性时:Reflection 计划采用(GCC 16+);Contracts 谨慎用于新 API 边界;std::execution 等待生态成熟。
- 用 std::make_unique、std::make_shared 替代 new/delete。
- 用 std::unique_ptr、std::shared_ptr 替代原始拥有指针。
- 用 std::array<int, N> 替代 C 数组 int arr[N]。
- 用 std::span<T> 替代指针+长度参数。
- 用 std::format、std::print 替代 printf/sprintf。
- 用 static_cast<int>(x) 替代 C 风格转换 (int)x。
- 用 constexpr 变量替代 #define 常量。
- 用 Concepts + requires 替代 SFINAE/enable_if。
- 用 std::expected<T, E> 替代错误码 + 输出参数。
- 用 std::variant 替代 union。
- 用 std::scoped_lock 替代原始 mutex.lock()/unlock()。
- 用 std::jthread 替代 std::thread。
- 用 contract_assert (C++26) 替代 assert() 宏。
- 用 Deducing this (C++23) 替代手动 CRTP。
- 用 Reflection (C++26) 替代宏代码生成。
- 阅读 ./references/anti-patterns.md 获取完整 30+ 模式迁移表。
- Tier 1 使用今天(C++20/23):Concepts + requires 替代 SFINAE、enable_if。
- Tier 1:Ranges + views 替代原始迭代器循环。
- Tier 1:std::span<T> 替代指针 + 长度。
- Tier 1:std::format 替代 sprintf、iostream 链。
- Tier 1:三路比较 <=> 替代手动比较运算符。
- Tier 1:std::jthread 替代 std::thread + 手动 join。
- Tier 1:Designated initializers 替代位置结构初始化。
- Tier 1:std::expected<T,E> 替代错误码、边界异常。
- Tier 1:std::print/std::println 替代 printf、std::cout <<。
- Tier 1:Deducing this 替代 CRTP、const/non-const 重复。
- Tier 1:std::flat_map 替代 std::map 用于读多场景。
- Tier 1:Monadic std::optional 替代嵌套 if 检查 optionals。
- 阅读 ./references/cpp20-features.md 和 ./references/cpp23-features.md。
- Tier 2 立即部署(无需标准升级):编译器加固标志 -D_FORTIFY_SOURCE=3、-fstack-protector-strong、-ftrivial-auto-var-init=zero。
- Tier 2:Hardened libc++ 使用 -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST,用于约 0.3% 开销的边界检查。
- Tier 2:CI 中运行 sanitizers,至少 ASan + UBSan;并发代码加 TSan。
- Tier 2:警告标志使用 -Wall -Wextra -Wpedantic -Werror。
- 阅读 ./references/compiler-hardening.md。
- Tier 3 计划(C++26):Reflection 是最具变革性的特性,消除序列化样板、代码生成器、宏注册和 enum-to-string 技巧。
- Tier 3:GCC 16 (April 2026) 已合并 reflection,计划新代码从中受益。
- Tier 4 观察(C++26):Contracts (pre/post/contract_assert) 优于 assert(),但无虚函数支持且编译器支持有限,谨慎用于新 API 边界。
- Tier 4:std::execution (senders/receivers) 强大但学习曲线陡、无调度器、文档差,等待生态成熟。
- 阅读 ./references/cpp26-features.md。
- 必要编译标志(GCC + Clang):-Wall -Wextra -Wpedantic -Werror; -D_FORTIFY_SOURCE=3; -fstack-protector-strong; -fstack-clash-protection; -ftrivial-auto-var-init=zero; -fPIE -pie; -Wl,-z,relro,-z,now。
- Clang 特定:-Wunsafe-buffer-usage。
- Hardened libc++(仅 Clang/libc++):-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST。
- 阅读 ./references/compiler-hardening.md 获取完整指南。
- 拒绝合理化:不要因为「编译无警告」就停止,添加 -Wall -Wextra -Wpedantic。
- 拒绝合理化:ASan 生产太慢时用 GWP-ASan 采样检测(约 0% 开销)。
- 拒绝合理化:只使用安全容器不够,仍需注意迭代器失效和未检查 optional 访问。
- 拒绝合理化:智能指针不一定慢,std::unique_ptr 相对原始指针零开销,先测量。
- 拒绝合理化:不要声称代码无内存 bug,启用 hardened libc++ 会发现。
- 拒绝合理化:C++26 特性未就绪时,先用 C++20/23 特性和加固标志。
- 拒绝合理化:现代 C++ 不一定更难读,std::expected 比检查 5 个输出参数的错误码更可读。
- 最佳实践:用智能指针管理所有权,原始指针仅用于非拥有观察。
- 最佳实践:函数参数优先 std::span 而非指针 + 长度。
- 最佳实践:可失败函数用 std::expected 返回类型化错误。
- 最佳实践:用 concepts 约束模板而非 SFINAE。
- 最佳实践:所有构建启用编译器加固标志和 hardened libc++。
- 最佳实践:CI 运行 ASan + UBSan;并发代码加 TSan。
- 最佳实践:尽可能用 constexpr/consteval(设计上无 UB)。
- 最佳实践:当忽略返回值可能是 bug 时标记 [[nodiscard]]。
- 最佳实践:优先值语义;用 std::variant 替代 union,enum class 替代 enum。
- 最佳实践:声明时初始化所有变量。
- 阅读 ./references/anti-patterns.md 获取完整旧到新迁移表(30+ 模式)。
- 阅读 ./references/cpp20-features.md 了解 Concepts、ranges、span、format、coroutines。
- 阅读 ./references/cpp23-features.md 了解 expected、print、deducing this、flat_map。
- 阅读 ./references/cpp26-features.md 了解 Reflection、contracts、内存安全改进。
- 阅读 ./references/compiler-hardening.md 了解标志、sanitizers、hardened libc++。
- 阅读 ./references/safe-idioms.md 了解按漏洞类别的安全模式。
适用边界 · 注意事项
- 用户明确要求旧标准(嵌入式、遗留 ABI)时,尊重约束,不要强行现代化。
- 纯 C 代码或 C++ 不是主要语言的混合代码库,本技能不适用。
- 构建系统问题(CMake、Meson、Bazel 配置)超出范围。