Skip to content

Commit a467128

Browse files
Michael-Jetsonclaude
andcommitted
docs(cpp): apply review fixes across all C++ chapters
Two review rounds + verification + fixes across 02_C++基础与进阶: - Correctness: factorial signed-overflow UB -> unsigned long long; PeriodicTask::ticks_ data race -> std::atomic; accumulate init 0L - Library accuracy: GTSAM right-perturbation (was 左扰动); LM Marquardt form note; V=J_l cross-ref; Huber/GICP notation; PCL r/g/b version - Standards: P0533R9 constexpr <cmath> excludes sin/cos (P1383/C++26); <scope> is C++26 not C++23 - Structure: renumber 19.17/20.14/36.16/37.19/23.17 + dedup; dedup volatile & SPSC sections with cross-refs; add missing knowledge trees; normalize ## headings; rename C++语言进阶->核心 (72 refs) - Engineering: CUDA deprecated cudaGraphInstantiate; CudaStreamOwner/ GraphRunner ownership guards; HPIPM complexity; IPOPT header; KKT note; addNanoseconds negative; pinToCore return check; Eigen xtmpl cross-refs Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 99c520f commit a467128

38 files changed

Lines changed: 387 additions & 440 deletions

02_C++基础与进阶/10_C++语言核心/100_Lambda与STL算法.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Lambda 表达式与 STL 算法深入
22

3-
> **难度**:⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:继承与多态深入 继承与多态深入、错误处理与异常安全 错误处理与异常安全、运算符重载 运算符重载
3+
> **难度**:⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:继承与多态深入、错误处理与异常安全运算符重载
44
55
---
66

@@ -32,7 +32,7 @@
3232

3333
**本章在课程中的位置**:继承与多态深入 讲运行时多态,适合插件和算法模块边界;运算符重载 讲 `operator()`,它让对象可以像函数一样调用。本章把这两条线连接起来:Lambda 是编译器生成的匿名函数对象,STL 算法则把”遍历容器并对元素执行操作”抽象成统一接口。机器人代码中的 ROS2 回调、TBB 并行点云处理、配置过滤、轨迹排序和事件系统都会用到这些能力。
3434

35-
### 知识树
35+
## 知识树
3636

3737
本章涉及的知识点形成以下树状结构。树的根是”C++ 如何表达可调用行为”,主干是 Lambda 的对象模型,分支是 STL 算法和容器工具。
3838

02_C++基础与进阶/10_C++语言核心/10_类型系统与值类别推导.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,10 +1367,13 @@ constexpr int factorial_11(int n) {
13671367
}
13681368

13691369
// C++14:可以用循环(更直观、更高效)
1370-
constexpr int factorial_14(int n) {
1371-
int result = 1;
1372-
for (int i = 2; i <= n; ++i)
1373-
result *= i;
1370+
// 注意返回类型用 unsigned long long:阶乘增长极快,13! = 6227020800 已超过
1371+
// INT_MAX(2147483647),用 int 会发生有符号整数溢出(未定义行为,UB)。
1372+
// 无符号类型溢出是良定义的回绕(取模 2^64),20! 仍可精确表示。
1373+
constexpr unsigned long long factorial_14(unsigned long long n) {
1374+
unsigned long long result = 1;
1375+
for (unsigned long long i = 2; i <= n; ++i)
1376+
result *= static_cast<unsigned long long>(i);
13741377
return result;
13751378
}
13761379

@@ -1423,7 +1426,7 @@ C++20 和 C++23 极大地扩展了 `constexpr` 的能力边界,使得越来越
14231426
| C++20 | `constexpr` 虚函数、析构函数、`new/delete`(瞬态) | 编译期多态、编译期动态数据结构 |
14241427
| C++20 | `constexpr std::vector`、`constexpr std::string` | 编译期容器操作 |
14251428
| C++23 | `constexpr std::unique_ptr`(P2273R3) | 编译期所有权管理 |
1426-
| C++23 | `constexpr <cmath>`(P0533R9)——`std::sin`、`std::cos` 等 | 编译期三角函数计算 |
1429+
| C++23 | `constexpr <cmath>` 基本函数(P0533R9)——`std::abs`、`std::ceil`、`std::floor`、`std::round` 等基本运算;`sin`/`cos` 等超越函数另见 P1383,目标 C++26 | 编译期基本数学运算 |
14271430
| C++23 | `constexpr <bitset>` | 编译期位操作 |
14281431
14291432
**C++20 的 `constexpr new/delete`** 是一个革命性的变化。它允许在 `constexpr` 函数中使用 `new` 和 `delete`——但有一个关键限制:**分配必须是瞬态的**(transient allocation),即在编译期求值结束前必须被释放。这意味着 `constexpr std::vector` 可以在编译期增长和收缩,但不能把堆分配的结果"带出"编译期留到运行时。
@@ -1443,7 +1446,7 @@ constexpr auto computeSquares() {
14431446
static_assert(computeSquares() == 285); // 0+1+4+9+16+25+36+49+64+81
14441447
```
14451448

1446-
**在机器人代码中的应用前景**随着 `constexpr std::sin/cos` C++23 中成为标准,之前需要用 Taylor 展开近似实现的编译期三角函数查找表,现在可以直接用标准库函数,精度和行为与运行时版本完全一致
1449+
**在机器人代码中的应用前景**上表中的 P0533R9 只覆盖了 `abs``ceil``floor``round` 等基本算术函数,`sin`/`cos` 等超越函数的 `constexpr` 化由另一份提案 P1383 负责,目标标准为 C++26。在此之前,若需要编译期三角函数查找表,仍需使用 Taylor 展开等手工近似实现——下面的代码示例就展示了这种过渡方案
14471450

14481451
> **反事实推理**:如果 C++11 一开始就有 `constexpr std::vector`,很多模板元编程中用递归类型列表实现的"编译期数组"就不需要了。`std::tuple` 的大量使用场景也可以被更直观的 `constexpr std::vector` 替代——代码从类型体操变成普通循环,可读性大幅提升。
14491452
@@ -1494,10 +1497,9 @@ constexpr double kMaxVelocity = 1.0; // m/s
14941497
constexpr double kControlFreq = 1000.0; // Hz
14951498
constexpr double kDt = 1.0 / kControlFreq; // 编译期计算时间步长
14961499

1497-
// constexpr 查找表——仅用于演示 constexpr 语法
1498-
// C++23 起 std::sin 已是 constexpr(P0533R9),实际项目直接用 std::sin 即可
1499-
// 以下 5 阶 Taylor 展开仅在 |x| < 1 rad(约 57°)时精度可接受,
1500-
// 超出此范围误差极大(sin(180°) ≈ 0.52 而非 0)——不可用于实际计算
1500+
// constexpr 查找表——用 Taylor 展开近似 sin,演示 C++23 尚无 constexpr std::sin 时的过渡写法
1501+
// 5 阶展开在 |x| < 1 rad(约 57°)时精度可接受;超出此范围误差极大(sin(180°) ≈ 0.52 而非 0)
1502+
// C++26 P1383 落地后可直接替换为 constexpr std::sin
15011503
constexpr auto makeSinTableDemo() {
15021504
std::array<double, 360> table{};
15031505
for (int i = 0; i < 360; ++i) {

02_C++基础与进阶/10_C++语言核心/130_模板特化SFINAE与类型萃取.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 模板特化、SFINAE 与类型萃取
22

3-
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2 周 | **前置要求**:Eigen基础与SLAM数学预备 Eigen 基础与 SLAM 数学预备、函数模板与类模板基础 函数模板与类模板基础
3+
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2 周 | **前置要求**:Eigen基础与SLAM数学预备 Eigen 基础与 SLAM 数学预备、函数模板与类模板基础
44
55
---
66

02_C++基础与进阶/10_C++语言核心/140_变参模板折叠表达式与CRTP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 变参模板、折叠表达式与 CRTP
22

3-
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2 周 | **前置要求**:类型系统与值类别推导 类型系统与值类别、移动语义与完美转发 移动语义与完美转发、函数模板与类模板基础 函数模板与类模板基础、模板特化SFINAE与类型萃取 模板特化与类型萃取
3+
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2 周 | **前置要求**:类型系统与值类别推导 类型系统与值类别、移动语义与完美转发函数模板与类模板基础、模板特化SFINAE与类型萃取 模板特化与类型萃取
44
55
---
66

02_C++基础与进阶/10_C++语言核心/150_预处理器与宏.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 预处理器与宏
22

3-
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:编译模型基础 C++ 编译模型基础、函数模板与类模板基础 函数模板与类模板基础、变参模板折叠表达式与CRTP 变参模板与 CRTP
3+
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:编译模型基础 C++ 编译模型基础、函数模板与类模板基础、变参模板折叠表达式与CRTP 变参模板与 CRTP
44
55
---
66

02_C++基础与进阶/10_C++语言核心/160_Concepts与Policy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# C++20 Concepts 与 Policy-based Design
22

3-
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:函数模板与类模板基础 函数模板与类模板基础、模板特化SFINAE与类型萃取 模板特化与类型萃取、变参模板折叠表达式与CRTP 变参模板与 CRTP、预处理器与宏 预处理器与宏
3+
> **难度**:⭐⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:函数模板与类模板基础、模板特化SFINAE与类型萃取 模板特化与类型萃取、变参模板折叠表达式与CRTP 变参模板与 CRTP、预处理器与宏
44
55
---
66

02_C++基础与进阶/10_C++语言核心/40_RAII与智能指针.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# RAII、智能指针与资源管理
22

3-
> **难度**:⭐~⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数 现代类设计与特殊成员函数
3+
> **难度**:⭐~⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数
44
55
---
66

@@ -248,7 +248,7 @@ RAII 并非凭空出现。它的诞生与 C++ 异常处理机制的引入密切
248248
}
249249
```
250250
251-
2. **思考题**:为什么 C++ 标准库到 C++23 才引入通用的 `std::scope_exit`?提示:考虑 `std::unique_ptr` + 自定义删除器是否已经覆盖了大部分需求,以及为什么委员会对"在析构函数中执行任意代码"这件事持谨慎态度。实际工具链的 `<scope>` 支持可能滞后,工程中要按编译器版本确认。
251+
2. **思考题**:`std::scope_exit` 源自 Library Fundamentals TS v3,直到 C++26 才正式纳入标准——为什么这么晚?提示:考虑 `std::unique_ptr` + 自定义删除器是否已经覆盖了大部分需求,以及委员会为什么对"在析构函数中执行任意代码"持谨慎态度。(截至 2026 年,主流编译器对 `<scope>` 的支持仍在推进中,工程中需按编译器版本确认可用性。)
252252
253253
3. **实践题**:在你的系统上运行一个循环 `new int[1000]` 不 `delete` 的程序,用 `htop` 或 `top` 观察内存增长速度。计算泄漏 1GB 需要多长时间。然后用 `std::vector<int>(1000)` 替换,确认内存稳定。
254254
@@ -1126,9 +1126,9 @@ void Tracking::processFrame(const Frame& frame) {
11261126

11271127
与 VINS-Fusion 的手动 `TicToc` 相比,RAII 计时器的优势在于**不可遗忘**——析构函数保证在作用域结束时触发,无论执行路径如何。
11281128

1129-
### C++23 `<scope>` 标准作用域守卫 ⭐⭐⭐
1129+
### C++26 `<scope>` 标准作用域守卫 ⭐⭐⭐
11301130

1131-
C++23 通过 Library Fundamentals TS v3 引入了 `<scope>` 头文件,提供了三种标准化的作用域守卫:
1131+
`<scope>` 头文件中的 `scope_exit``scope_success``scope_fail` 源自 Library Fundamentals TS v3,已被投票纳入 **C++26** 标准,提供了三种标准化的作用域守卫:
11321132

11331133
| 类型 | 执行条件 | 典型用途 |
11341134
|------|---------|---------|
@@ -1137,7 +1137,7 @@ C++23 通过 Library Fundamentals TS v3 引入了 `<scope>` 头文件,提供
11371137
| `std::scope_fail` | 仅在异常退出时执行 | 回滚事务 |
11381138

11391139
```cpp
1140-
#include <scope> // C++23(实际工具链支持可能滞后
1140+
#include <scope> // C++26(实际工具链支持可能滞后于标准发布
11411141

11421142
void transferFunds(Account& from, Account& to, double amount) {
11431143
from.debit(amount);

02_C++基础与进阶/10_C++语言核心/50_移动语义与完美转发.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 移动语义与完美转发
22

3-
> **难度**:⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数 现代类设计与特殊成员函数、RAII与智能指针 RAII 与智能指针
3+
> **难度**:⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数、RAII与智能指针 RAII 与智能指针
44
55
---
66

@@ -31,7 +31,7 @@
3131

3232
**本章在课程中的位置**:现代类设计与特殊成员函数 讲了特殊成员函数的自动生成规则——你已经知道移动构造和移动赋值是什么。RAII与智能指针 讲了智能指针——你已经看到 `unique_ptr` 的移动构造如何实现所有权转移。本章将**深入移动语义的底层机制**`std::move` 到底做了什么?编译器怎么决定调用移动构造还是拷贝构造?完美转发如何在模板中保持参数类型不变?这些机制是理解现代 SLAM 库(KISS-ICP、small_gicp、Kimera-VIO)API 设计的必备知识。
3333

34-
### 知识树
34+
## 知识树
3535

3636
```text
3737
移动语义与完美转发

02_C++基础与进阶/10_C++语言核心/60_继承与多态深入.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 继承与多态深入
22

3-
> **难度**:⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数 现代类设计与特殊成员函数、RAII与智能指针 RAII 与智能指针、移动语义与完美转发 移动语义与完美转发
3+
> **难度**:⭐⭐~⭐⭐⭐⭐ | **建议用时**:2周 | **前置要求**:现代类设计与特殊成员函数、RAII与智能指针 RAII 与智能指针、移动语义与完美转发
44
55
---
66

@@ -30,7 +30,7 @@
3030

3131
**本章在课程中的位置**:现代类设计与特殊成员函数 解决”一个类该如何管理自己的资源和特殊成员函数”,RAII与智能指针 解决”资源生命周期如何自动释放”,移动语义与完美转发 解决”大对象所有权如何高效转移”。本章把这些能力放进真实机器人系统的接口设计中:当一个系统需要在运行时切换算法模块时,C++ 需要一种”只依赖共同接口,却能调用具体实现”的机制,这就是继承与多态要解决的问题。
3232

33-
### 知识树
33+
## 知识树
3434

3535
```text
3636
继承与多态深入

02_C++基础与进阶/10_C++语言核心/70_类型转换.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
回顾 继承与多态深入:运行时多态依赖虚函数表和对象的动态类型;本章只激活这点,用它解释 `dynamic_cast`,不重复继承体系全章内容。
3434
变参模板折叠表达式与CRTP 会系统讲 CRTP、变参模板和模板元编程,本章只用 CRTP 说明 `static_cast` 的一个关键动机。
3535

36-
### 知识树
36+
## 知识树
3737

3838
```text
3939
类型转换

0 commit comments

Comments
 (0)