C++ 编码标准(C++ 核心准则)
源自 C++ 核心准则 的现代 C++(C++17/20/23)综合编码标准。强制执行类型安全、资源安全、不变性和清晰性。
何时使用
- 编写新的 C++ 代码(类、函数、模板)
- 审查或重构现有的 C++ 代码
- 在 C++ 项目中做出架构决策
- 在 C++ 代码库中强制执行一致的风格
- 在语言特性之间做出选择(例如,
enum对比enum class,原始指针对比智能指针)
何时不应使用
- 非 C++ 项目
- 无法采用现代 C++ 特性的遗留 C 代码库
- 特定准则与硬件限制冲突的嵌入式/裸机环境(选择性适配)
贯穿性原则
这些主题在整个准则中反复出现,并构成了基础:
- 处处使用 RAII (P.8, R.1, E.6, CP.20):将资源生命周期绑定到对象生命周期
- 默认为不可变性 (P.10, Con.1-5, ES.25):从
const/constexpr开始;可变性是例外 - 类型安全 (P.4, I.4, ES.46-49, Enum.3):使用类型系统在编译时防止错误
- 表达意图 (P.3, F.1, NL.1-2, T.10):名称、类型和概念应传达目的
- 最小化复杂性 (F.2-3, ES.5, Per.4-5):简单的代码就是正确的代码
- 值语义优于指针语义 (C.10, R.3-5, F.20, CP.31):优先按值返回和作用域对象
哲学与接口 (P.*, I.*)
关键规则
| 规则 | 摘要 |
|---|---|
| P.1 | 直接在代码中表达想法 |
| P.3 | 表达意图 |
| P.4 | 理想情况下,程序应是静态类型安全的 |
| P.5 | 优先编译时检查而非运行时检查 |
| P.8 | 不要泄漏任何资源 |
| P.10 | 优先不可变数据而非可变数据 |
| I.1 | 使接口明确 |
| I.2 | 避免非 const 全局变量 |
| I.4 | 使接口精确且强类型化 |
| I.11 | 切勿通过原始指针或引用转移所有权 |
| I.23 | 保持函数参数数量少 |
应该做
// P.10 + I.4: Immutable, strongly typed interface
struct Temperature {
double k…