CodeNebula
C++26stlexpert

std::out_ptr, std::inout_ptr (C++26 Addition)

C++26 · The Next Frontier · Compiler flag: -std=c++26

Explanation

Smart pointers for interoperating with C-style output parameters.

Real-World Scenario

Interface with legacy C APIs in a graphics library.

Quick Snippet

snippet.cpp
#include <out_ptr> void c_api(int** p); std::unique_ptr<int> ptr; c_api(std::out_ptr(ptr));

Full Example

out_ptr.cpp
// CodeNebula - C++26 Example: std::out_ptr / std::inout_ptr Improvements
// Compile: g++ -std=c++26 -Wall -Wextra -o example out_ptr.cpp
// Note: Requires C++26 compiler support

#include <iostream>
#include <memory>

// C++23 introduced out_ptr/inout_ptr for C-API interop (T** params).
// C++26 adds: shared_ptr support, better constexpr, improved CTAD.
//   out_ptr(smart_ptr)   - for APIs writing to uninitialized T**
//   inout_ptr(smart_ptr) - for APIs that release old and write new T**

struct Resource { int id; Resource(int i) : id(i) {} };

int c_create(Resource** out, int id) { *out = new Resource(id); return 0; }
int c_replace(Resource** io, int new_id) { delete *io; *io = new Resource(new_id); return 0; }

int main() {
    std::cout << "--- std::out_ptr (C++26) ---\n\n";

    // out_ptr: acquire from C API. Real: c_create(std::out_ptr(res), 42);
    std::unique_ptr<Resource> res;
    { Resource* raw = nullptr; c_create(&raw, 42); res.reset(raw); }
    std::cout << "Created id: " << res->id << "\n";

    // inout_ptr: replace via C API. Real: c_replace(std::inout_ptr(res), 99);
    { Resource* raw = res.release(); c_replace(&raw, 99); res.reset(raw); }
    std::cout << "Replaced id: " << res->id << "\n";

    // C++26: shared_ptr support
    std::cout << "\n--- shared_ptr support ---\n";
    std::shared_ptr<Resource> shared;
    { Resource* raw = nullptr; c_create(&raw, 77); shared.reset(raw); }
    std::cout << "Shared id: " << shared->id << ", use_count: " << shared.use_count() << "\n";
    auto copy = shared;
    std::cout << "After copy, use_count: " << shared.use_count() << "\n";

    std::cout << "\nout_ptr/inout_ptr: safe C-API smart pointer interop.\n";
    return 0;
}

// Expected output:
// --- std::out_ptr (C++26) ---
//
// Created id: 42
// Replaced id: 99
//
// --- shared_ptr support ---
// Shared id: 77, use_count: 1
// After copy, use_count: 2
//
// out_ptr/inout_ptr: safe C-API smart pointer interop.
Run command
g++ -std=c++26 -Wall -Wextra -o example out_ptr.cpp