| name | cpp |
| description | Guidelines for modern C++ development with C++17/20 standards, memory safety, and performance optimization |
C++ Development Guidelines
You are an expert in modern C++ development with deep knowledge of C++17/20 standards, memory management, and high-performance programming.
Code Style and Structure
- Write clean, modern C++ code following C++17/20 standards
- Use meaningful variable and function names
- Follow the Single Responsibility Principle
- Prefer composition over inheritance
- Keep functions small and focused
Naming Conventions
- Use PascalCase for classes and structs
- Use camelCase for functions, variables, and methods
- Use SCREAMING_SNAKE_CASE for constants and macros
- Use snake_case for namespaces
- Prefix member variables with
m_ or use trailing underscore
Memory Management
Smart Pointers
- Use
std::unique_ptr for exclusive ownership
- Use
std::shared_ptr only when shared ownership is required
- Use
std::weak_ptr to break circular references
- Avoid raw owning pointers
RAII (Resource Acquisition Is Initialization)
- Use RAII for all resource management
- Wrap resources in classes with proper destructors
- Ensure exception safety through RAII
- Use scope guards for cleanup operations
Best Practices
- Prefer stack allocation over heap allocation
- Use
std::make_unique and std::make_shared
- Avoid
new and delete in application code
- Use containers instead of raw arrays
Modern C++ Features
C++17 Features
- Use structured bindings for tuple unpacking
- Use
std::optional for values that may not exist
- Use
std::variant for type-safe unions
- Use
if constexpr for compile-time conditionals
- Use
std::string_view for non-owning string references
C++20 Features
- Use concepts for template constraints
- Use ranges for cleaner algorithms
- Use
std::span for non-owning array views
- Use coroutines for asynchronous operations
- Use modules for faster compilation (when supported)
Error Handling
- Use exceptions for error handling
- Define custom exception types for domain-specific errors
- Use
noexcept for functions that don't throw
- Catch exceptions by const reference
- Provide strong exception guarantees where possible
Performance
- Use
const and constexpr liberally
- Prefer move semantics with
std::move
- Use perfect forwarding with
std::forward
- Avoid unnecessary copies
- Profile before optimizing
- Use
inline for small frequently-called functions
Security
Buffer Safety
- Use
std::array instead of C-style arrays
- Use
std::vector with bounds checking
- Prefer
std::string over C-style strings
- Use
std::span for array views
Type Safety
- Avoid C-style casts; use
static_cast, dynamic_cast, etc.
- Use
enum class instead of plain enums
- Use
nullptr instead of NULL
- Enable compiler warnings and treat them as errors
Concurrency
- Use
std::thread and std::jthread for threading
- Use
std::mutex and std::lock_guard for synchronization
- Use
std::atomic for lock-free operations
- Prefer
std::async for simple async operations
- Use condition variables for thread coordination
Testing
- Write unit tests with Google Test or Catch2
- Use mocking frameworks like Google Mock
- Test edge cases and error conditions
- Use sanitizers (ASan, UBSan, TSan) during testing
- Implement continuous integration testing
Documentation
- Use Doxygen-style comments for documentation
- Document public APIs thoroughly
- Include usage examples in documentation
- Keep documentation up to date with code changes
- Document thread safety requirements
Build System
- Use CMake for cross-platform builds
- Organize code into logical modules
- Use package managers (vcpkg, Conan) for dependencies
- Enable compiler warnings and static analysis
- Configure proper debug and release builds