# Cpp Modern Pro

> 当用 C++11/14/17/20/23 编写或重构代码、需要内存安全与高性能时使用；产出符合 Core Guidelines 的惯用代码、CMakeLists、单测与基准、Sanitizer 干净输出；不适用于 C 语言、嵌入式裸机或非 C++ 任务。触发词：现代 C++、RAII、智能指针、移动语义、STL 算法、模板

- Skill: `findscripter/cpp-modern-pro` (Agent Skill)
- Install (CLI): `npx skillmds@latest add findscripter/cpp-modern-pro`
- Raw SKILL.md: https://api.skillmd.com/api/skills/findscripter/cpp-modern-pro/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: findscripter (https://skillmd.com/u/findscripter)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/findscripter/cpp-modern-pro

---

## 何时使用

适用：
- 用现代 C++（C++11/14/17/20/23）编写或重构代码，追求惯用、类型安全与高性能。
- 涉及内存管理、生命周期、资源管理（文件/锁/句柄）、移动语义、模板与并发的设计取舍。
- 需要配套 CMakeLists、单元测试、Sanitizer 验证与性能基准。

不该用（负边界）：
- 任务与 C++ 无关，或是纯 C 语言、嵌入式裸机/无标准库环境。
- 需要其他领域或本范围之外的工具链。
- 缺少必要输入（目标、约束、平台/编译器、成功标准）时，先停下来澄清，不要臆测。

## 步骤

1. 澄清目标、约束与输入：C++ 标准版本、目标平台/编译器、性能或安全指标。
2. 优先栈分配与 RAII，避免手工 new/delete 管理内存。
3. 确需堆分配时使用智能指针：独占用 `unique_ptr`，共享所有权才用 `shared_ptr`。
4. 遵循 Rule of Zero/Three/Five：能不写特殊成员函数就不写（Rule of Zero 优先）。
5. 贯彻 const 正确性，能编译期求值的用 `constexpr`；C++20 起用 concepts 约束模板。
6. 用 STL 算法替代裸循环（`std::transform`/`std::accumulate`/`ranges` 等）。
7. 移动语义与完美转发：转移所有权用 `std::move`，转发引用用 `std::forward`。
8. 并发用 `std::thread`/`std::atomic`/`std::mutex`，明确异常安全保证（基本/强/不抛）。
9. 用 perf、VTune 做性能剖析后再优化，避免凭感觉调优。
10. 交付前用 ASan/TSan 跑出干净输出，并补单测与基准。

## 指令

- 偏向编译期错误而非运行期错误：优先 concepts、`static_assert`、类型约束在编译期拦截问题。
- 遵循 C++ Core Guidelines。
- 头文件用 `#pragma once` 或规范的 include guard。
- CMakeLists 显式指定 C++ 标准（如 `set(CMAKE_CXX_STANDARD 20)` 与 `CMAKE_CXX_STANDARD_REQUIRED ON`）。
- 单测用 Google Test 或 Catch2；基准用 Google Benchmark。
- 为模板接口写清晰文档（约束、要求、复杂度）。
- 输出不能替代环境内的实测、测试与专家评审。

## 示例

智能指针与 RAII（独占所有权，Rule of Zero）：

```cpp
#include <memory>
#include <vector>

struct Widget {
    explicit Widget(int id) : id_(id) {}
    int id_;
};

// 优先栈/容器管理生命周期，无需手写析构
std::vector<std::unique_ptr<Widget>> make_widgets() {
    std::vector<std::unique_ptr<Widget>> v;
    v.push_back(std::make_unique<Widget>(1));
    return v; // 移动返回，零拷贝
}
```

STL 算法替代裸循环：

```cpp
#include <numeric>
#include <vector>

long long sum_squares(const std::vector<int>& xs) {
    return std::accumulate(xs.begin(), xs.end(), 0LL,
        [](long long acc, int x) { return acc + 1LL * x * x; });
}
```

CMake 与 Sanitizer（开发期开启 ASan）：

```cmake
cmake_minimum_required(VERSION 3.16)
project(demo CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_compile_options(-Wall -Wextra)
# 调试构建开启地址消毒器
add_compile_options($<$<CONFIG:Debug>:-fsanitize=address>)
add_link_options($<$<CONFIG:Debug>:-fsanitize=address>)
```

## 注意事项

- 不要默认用 `shared_ptr`：引用计数有开销且易掩盖所有权设计问题，只有真正共享所有权时才用。
- 警惕悬垂引用：返回局部变量引用、lambda 按引用捕获后逃逸作用域。
- 移动后对象处于有效但未指定状态，移动后不要再读其值。
- `std::forward` 仅对转发引用（`T&&` 配合模板推导）使用，不要乱用。
- 并发下注意数据竞争，TSan 干净不等于逻辑正确；锁与原子要配合异常安全。
- 编译期检查（concepts/static_assert）优先于运行期断言。

## 互见

- 性能剖析工具链（perf、VTune、Google Benchmark）的深入用法。
- 单元测试框架（Google Test / Catch2）实践。
- C++ Core Guidelines 与 Sanitizer（ASan/TSan/UBSan）使用规范。

---
采编自 sickn33/antigravity-awesome-skills（MIT）。

