affaan-m/everything-claude-code/cpp-coding-standards
- community
Checking that the SKILL.md file is still in the repository.
C++ coding standards based on the C++ Core Guidelines (isocpp.github.io). Use when writing, reviewing, or refactoring C++ code to enforce modern, safe, and idiomatic practices.
Install
npx vskill@latest install affaan-m/everything-claude-code/cpp-coding-standardsSKILL.md
C++ Coding Standards (C++ Core Guidelines)
Comprehensive coding standards for modern C++ (C++17/20/23) derived from the C++ Core Guidelines. Enforces type safety, resource safety, immutability, and clarity.
When to Use
- Writing new C++ code (classes, functions, templates)
- Reviewing or refactoring existing C++ code
- Making architectural decisions in C++ projects
- Enforcing consistent style across a C++ codebase
- Choosing between language features (e.g.,
enumvsenum class, raw pointer vs smart pointer)
When NOT to Use
- Non-C++ projects
- Legacy C codebases that cannot adopt modern C++ features
- Embedded/bare-metal contexts where specific guidelines conflict with hardware constraints (adapt selectively)
Cross-Cutting Principles
These themes recur across the entire guidelines and form the foundation:
- RAII everywhere (P.8, R.1, E.6, CP.20): Bind resource lifetime to object lifetime
- Immutability by default (P.10, Con.1-5, ES.25): Start with
const/constexpr; mutability is the exception - Type safety (P.4, I.4, ES.46-49, Enum.3): Use the type system to prevent errors at compile time
- Express intent (P.3, F.1, NL.1-2, T.10): Names, types, and concepts should communicate purpose
- Minimize complexity (F.2-3, ES.5, Per.4-5): Simple code is correct code
- Value semantics over pointer semantics (C.10, R.3-5, F.20, CP.31): Prefer returning by value and scoped objects
Philosophy & Interfaces (P., I.)
Key Rules
| Rule | Summary | |
|---|---|---|
| P.1 | Express ideas directly in code | |
| P.3 | Express intent | |
| P.4 | Ideally, a program should be statically type safe | |
| P.5 | Prefer compile-time checking to run-time checking | |
| P.8 | Don't leak any resources | |
| P.10 | Prefer immutable data to mutable data | |
| I.1 | Make interfaces explicit | |
| I.2 | Avoid non-const global variables | |
| I.4 | Make interfaces precisely and strongly typed | |
| I.11 | Never transfer ownership by a raw pointer or reference | |
| I.23 | Keep the number of function arguments low |
DO
DON'T
Functions (F.*)
Key Rules
| Rule | Summary | |
|---|---|---|
| F.1 | Package meaningful operations as carefully named functions | |
| F.2 | A function should perform a single logical operation | |
| F.3 | Keep functions short and simple | |
| F.4 | If a function might be evaluated at compile time, declare it constexpr | |
| F.6 | If your function must not throw, declare it noexcept | |
| F.8 | Prefer pure functions | |
| F.16 | For "in" parameters, pass cheaply-copied types by value and others by const& | |
| F.20 | For "out" values, prefer return values to output parameters | |
| F.21 | To return multiple "out" values, prefer returning a struct | |
| F.43 | Never return a pointer or reference to a local object |
Parameter Passing
Pure Functions and constexpr
Anti-Patterns
- Returning
T&&from functions (F.45) - Using
va_arg/ C-style variadics (F.55) - Capturing by reference in lambdas passed to other threads (F.53)
- Returning
const Twhich inhibits move semantics (F.49)
Classes & Class Hierarchies (C.*)
Key Rules
| Rule | Summary | |
|---|---|---|
| C.2 | Use class if invariant exists; struct if data members vary independently | |
| C.9 | Minimize exposure of members | |
| C.20 | If you can avoid defining default operations, do (Rule of Zero) | |
| C.21 | If you define or =delete any copy/move/destructor, handle them all (Rule of Five) | |
| C.35 | Base class destructor: public virtual or protected non-virtual | |
| C.41 | A constructor should create a fully initialized object | |
| C.46 | Declare single-argument constructors explicit | |
| C.67 | A polymorphic class should suppress public copy/move | |
| C.128 | Virtual functions: specify exactly one of virtual, override, or final |
Rule of Zero
Rule of Five
Class Hierarchy
Anti-Patterns
- Calling virtual functions in constructors/destructors (C.82)
- Using
memset/memcpyon non-trivial types (C.90) - Providing different default arguments for virtual function and overrider (C.140)
- Making data members
constor references, which suppresses move/copy (C.12)
Resource Management (R.*)
Key Rules
| Rule | Summary | |
|---|---|---|
| R.1 | Manage resources automatically using RAII | |
| R.3 | A raw pointer (T*) is non-owning | |
| R.5 | Prefer scoped objects; don't heap-allocate unnecessarily | |
| R.10 | Avoid malloc()/free() | |
| R.11 | Avoid calling new and delete explicitly | |
| R.20 | Use unique_ptr or shared_ptr to represent ownership | |
| R.21 | Prefer unique_ptr over shared_ptr unless sharing ownership | |
| R.22 | Use make_shared() to make shared_ptrs |
Smart Pointer Usage
RAII Pattern
Anti-Patterns
- Naked
new/delete(R.11) malloc()/free()in C++ code (R.10)- Multiple resource allocations in a single expression (R.13 -- exception safety hazard)
shared_ptrwhereunique_ptrsuffices (R.21)
Expressions & Statements (ES.*)
Key Rules
| Rule | Summary | |
|---|---|---|
| ES.5 | Keep scopes small | |
| ES.20 | Always initialize an object | |
| ES.23 | Prefer {} initializer syntax | |
| ES.25 | Declare objects const or constexpr unless modification is intended | |
| ES.28 | Use lambdas for complex initialization of const variables | |
| ES.45 | Avoid magic constants; use symbolic constants | |
| ES.46 | Avoid narrowing/lossy arithmetic conversions | |
| ES.47 | Use nullptr rather than 0 or NULL | |
| ES.48 | Avoid casts | |
| ES.50 | Don't cast away const |
Initialization
Anti-Patterns
- Uninitialized variables (ES.20)
- Using
0orNULLas pointer (ES.47 -- usenullptr) - C-style casts (ES.48 -- use
static_cast,const_cast, etc.) - Casting away
const(ES.50) - Magic numbers without named constants (ES.45)
- Mixing signed and unsigned arithmetic (ES.100)
- Reusing names in nested scopes (ES.12)
Error Handling (E.*)
Key Rules
| Rule | Summary | |
|---|---|---|
| E.1 | Develop an error-handling strategy early in a design | |
| E.2 | Throw an exception to signal that a function can't perform its assigned task | |
| E.6 | Use RAII to prevent leaks | |
| E.12 | Use noexcept when throwing is impossible or unacceptable | |
| E.14 | Use purpose-designed user-defined types as exceptions | |
| E.15 | Throw by value, catch by reference | |
| E.16 | Destructors, deallocation, and swap must never fail | |
| E.17 | Don't try to catch every exception in every function |
Exception Hierarchy
Anti-Patterns
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 96 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/cpp-coding-standards/SKILL.md
Popularity
- Repository stars
- 183,359
- Repository forks
- 28,269
- Repository npm downloads, 7 days
- 1,824
- 7-day trend score
- 77
Stars and forks are for the whole GitHub repository, not this skill alone. Downloads are for the repository's npm package. Refreshed 19 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/affaan-m/everything-claude-code/cpp-coding-standards)