C++26 New Features: Expected Features and Proposals
C++26 New Features: Expected Features and Proposals
C++26 is the upcoming C++ standard (expected 2026). This guide covers expected features based on current proposals and working drafts. Note: Features may change before finalization.
Core Language Features
1. Static Reflection
Reflection capabilities for compile-time introspection.
// Expected C++26: Static reflection
#include <experimental/reflect>
struct Point {
int x;
int y;
};
// Get type information
constexpr auto point_type = reflexpr(Point);
constexpr auto members = get_public_data_members(point_type);
// Iterate over members
for_each(member : members) {
std::cout << get_name(member) << std::endl;
}
// Create from reflection
template<typename T>
void print_structure() {
constexpr auto type = reflexpr(T);
std::cout << "Struct: " << get_name(type) << std::endl;
for_each(member : get_public_data_members(type)) {
std::cout << " " << get_name(member) << ": "
<< get_type(member) << std::endl;
}
}
print_structure<Point>();
2. Pattern Matching
Expressive pattern matching syntax.
// Expected C++26: Pattern matching
#include <experimental/match>
// Match on value
int result = match(value) {
case 0 => 1;
case 1 => 2;
case 2 => 3;
default => 0;
};
// Match on type (variant)
std::variant<int, double, std::string> v = 42;
auto result = match(v) {
case int i => i * 2;
case double d => d / 2.0;
case std::string s => s.length();
};
// Match on structure
struct Point { int x, y; };
Point p{10, 20};
auto result = match(p) {
case Point{0, 0} => "origin";
case Point{x, 0} => "on x-axis";
case Point{0, y} => "on y-axis";
case Point{x, y} if x == y => "on diagonal";
case Point{x, y} => "general point";
};
// Match on optional
std::optional<int> opt = 42;
auto result = match(opt) {
case std::some(int x) => x * 2;
case std::none => 0;
};
3. Contracts
Preconditions, postconditions, and assertions.
// Expected C++26: Contracts
int divide(int a, int b)
[[pre: b != 0]] // Precondition
[[post r: r == a / b]] // Postcondition
{
return a / b;
}
void process(int* ptr)
[[pre: ptr != nullptr]]
[[post: *ptr > 0]]
{
*ptr = 42;
}
// Contract levels
void func(int x)
[[pre audit: x > 0]] // Checked in debug builds
[[pre: x < 100]] // Always checked
{
// ...
}
4. Named Parameters
Named function arguments.
// Expected C++26: Named parameters
struct create_window_params {
int width = 800;
int height = 600;
std::string title = "Window";
bool resizable = true;
};
void create_window(create_window_params params);
// Usage
create_window({
.width = 1024,
.height = 768,
.title = "My App"
});
// Or with designated initializers
create_window({
width: 1024,
height: 768,
title: "My App"
});
5. Value Semantics Improvements
Better support for value types.
// Expected C++26: Value semantics
class Value {
int data_;
public:
Value(int d) : data_(d) {}
// Automatic value semantics
friend auto operator<=>(const Value&, const Value&) = default;
// Value-based operations
Value operator+(const Value& other) const {
return Value(data_ + other.data_);
}
};
// Improved move semantics
Value func() {
Value v(42);
return v; // Guaranteed move or elision
}
6. operator[] with Multiple Arguments
// Expected C++26: Enhanced subscript
class Matrix {
int data_[10][10];
public:
// Already in C++23, but improvements expected
int& operator[](size_t i, size_t j) {
return data_[i][j];
}
// With default arguments
int& operator[](size_t i, size_t j = 0) {
return data_[i][j];
}
};
7. comparable Concept
// Expected C++26: Comparable concept
template<std::comparable T>
void sort(T& container) {
// T must be comparable
}
// Custom comparable types
struct MyType {
int value;
auto operator<=>(const MyType&) const = default;
};
static_assert(std::comparable<MyType>);
8. std::meta::info
Reflection metadata type.
// Expected C++26: Reflection metadata
#include <experimental/meta>
template<typename T>
constexpr std::meta::info get_type_info() {
return reflexpr(T);
}
template<std::meta::info TypeInfo>
void process_type() {
// Work with type information
}
Standard Library
9. Networking Library
Standard networking support.
// Expected C++26: Networking
#include <experimental/net>
namespace net = std::experimental::net;
// TCP server
net::io_context ctx;
net::ip::tcp::acceptor acceptor(ctx, net::ip::tcp::endpoint(
net::ip::tcp::v4(), 8080));
void accept_connection() {
auto socket = std::make_shared<net::ip::tcp::socket>(ctx);
acceptor.async_accept(*socket, [socket](std::error_code ec) {
if (!ec) {
handle_client(socket);
}
accept_connection();
});
}
// HTTP client
net::http::client client(ctx);
auto response = client.get("https://example.com");
10. std::hive (Planned)
High-performance container for frequent insertions/deletions.
// Expected C++26: std::hive
#include <hive>
std::hive<int> container;
// Optimized for frequent insertions/deletions
container.insert(1);
container.insert(2);
container.erase(container.begin());
// Maintains iterator stability
auto it = container.begin();
container.insert(3); // it still valid
11. std::flat_map and std::flat_set
Flat associative containers.
// Expected C++26: Flat containers
#include <flat_map>
#include <flat_set>
std::flat_map<std::string, int> map;
map["one"] = 1;
map["two"] = 2;
// Better cache locality than std::map
std::flat_set<int> set = {1, 2, 3, 4, 5};
12. std::ranges::zip Improvements
// Expected C++26: Enhanced zip
#include <ranges>
std::vector<int> vec1 = {1, 2, 3};
std::vector<std::string> vec2 = {"a", "b", "c"};
std::vector<double> vec3 = {1.5, 2.5, 3.5};
// Zip multiple ranges
for (auto [a, b, c] : std::views::zip(vec1, vec2, vec3)) {
std::cout << a << " " << b << " " << c << std::endl;
}
13. std::ranges::enumerate
Enumerate range elements.
// Expected C++26: Enumerate
#include <ranges>
std::vector<int> vec = {10, 20, 30};
for (auto [index, value] : std::views::enumerate(vec)) {
std::cout << index << ": " << value << std::endl;
}
14. std::ranges::adjacent and std::ranges::pairwise
Adjacent element views.
// Expected C++26: Adjacent views
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Adjacent pairs
for (auto [a, b] : vec | std::views::adjacent<2>) {
std::cout << a << ", " << b << std::endl;
}
// Pairwise
for (auto [a, b] : vec | std::views::pairwise) {
std::cout << a << ", " << b << std::endl;
}
15. std::ranges::chunk_by Improvements
// Expected C++26: Enhanced chunk_by
#include <ranges>
std::vector<int> vec = {1, 2, 3, 10, 11, 12, 20, 21};
// Chunk by predicate with more control
auto chunks = vec | std::views::chunk_by([](int a, int b) {
return b - a <= 5;
});
16. std::ranges::join_with Improvements
// Expected C++26: Enhanced join
#include <ranges>
std::vector<std::vector<int>> vecs = {{1, 2}, {3, 4}, {5, 6}};
// Join with custom separator
auto joined = vecs | std::views::join_with(std::vector{-1});
17. std::ranges::repeat_n
Repeat value N times.
// Expected C++26: Repeat N times
#include <ranges>
// Repeat value N times
for (auto val : std::views::repeat_n(42, 5)) {
std::cout << val << " "; // 42 42 42 42 42
}
18. std::ranges::stride
Stride view.
// Expected C++26: Stride
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
// Every 2nd element
for (auto val : vec | std::views::stride(2)) {
std::cout << val << " "; // 1 3 5 7
}
19. std::ranges::cycle
Cycle through range.
// Expected C++26: Cycle
#include <ranges>
std::vector<int> vec = {1, 2, 3};
// Cycle infinitely
for (auto val : vec | std::views::cycle | std::views::take(10)) {
std::cout << val << " "; // 1 2 3 1 2 3 1 2 3 1
}
20. std::ranges::sample
Sample elements from range.
// Expected C++26: Sample
#include <ranges>
#include <random>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Sample 3 random elements
std::mt19937 gen(std::random_device{}());
auto sampled = vec | std::views::sample(3, gen);
21. std::ranges::chunk Improvements
// Expected C++26: Enhanced chunk
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
// Chunk with overlap
for (auto chunk : vec | std::views::chunk(3, 1)) { // Overlap of 1
// ...
}
22. std::ranges::group_by
Group by key function.
// Expected C++26: Group by
#include <ranges>
std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 4};
// Group by value
for (auto group : vec | std::views::group_by(std::equal_to{})) {
for (auto val : group) {
std::cout << val << " ";
}
std::cout << std::endl;
}
23. std::ranges::adjacent_transform
Transform adjacent elements.
// Expected C++26: Adjacent transform
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Differences between adjacent elements
auto diffs = vec | std::views::adjacent_transform<2>([](int a, int b) {
return b - a;
});
24. std::ranges::windows
Sliding window view.
// Expected C++26: Windows
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Sliding window of size 3
for (auto window : vec | std::views::windows(3)) {
for (auto val : window) {
std::cout << val << " ";
}
std::cout << std::endl;
}
25. std::ranges::concat
Concatenate ranges.
// Expected C++26: Concat
#include <ranges>
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
std::vector<int> vec3 = {7, 8, 9};
// Concatenate multiple ranges
for (auto val : std::views::concat(vec1, vec2, vec3)) {
std::cout << val << " "; // 1 2 3 4 5 6 7 8 9
}
26. std::ranges::interleave
Interleave ranges.
// Expected C++26: Interleave
#include <ranges>
std::vector<int> vec1 = {1, 3, 5};
std::vector<int> vec2 = {2, 4, 6};
// Interleave elements
for (auto val : std::views::interleave(vec1, vec2)) {
std::cout << val << " "; // 1 2 3 4 5 6
}
27. std::ranges::round_robin
Round-robin through ranges.
// Expected C++26: Round robin
#include <ranges>
std::vector<int> vec1 = {1, 4};
std::vector<int> vec2 = {2, 5};
std::vector<int> vec3 = {3, 6};
// Round-robin
for (auto val : std::views::round_robin(vec1, vec2, vec3)) {
std::cout << val << " "; // 1 2 3 4 5 6
}
28. std::ranges::take_while and std::ranges::drop_while Improvements
// Expected C++26: Enhanced take/drop while
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
// Take while condition
auto taken = vec | std::views::take_while([](int x) { return x < 5; });
// Drop while condition
auto dropped = vec | std::views::drop_while([](int x) { return x < 3; });
29. std::ranges::split Improvements
// Expected C++26: Enhanced split
#include <ranges>
std::string str = "hello,world,test";
// Split by delimiter
for (auto part : str | std::views::split(',')) {
std::cout << std::string_view(part.begin(), part.end()) << std::endl;
}
30. std::ranges::elements and std::ranges::keys/values
Extract elements from pairs/tuples.
// Expected C++26: Elements extraction
#include <ranges>
std::vector<std::pair<int, std::string>> pairs = {
{1, "one"}, {2, "two"}, {3, "three"}
};
// Extract keys
auto keys = pairs | std::views::keys; // 1, 2, 3
// Extract values
auto values = pairs | std::views::values; // "one", "two", "three"
// Extract nth element
auto firsts = pairs | std::views::elements<0>;
auto seconds = pairs | std::views::elements<1>;
Other Expected Features
31. std::ranges::as_const and std::ranges::as_mutable
Const/mutable views.
// Expected C++26: Const/mutable views
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Const view
auto const_view = vec | std::views::as_const;
// Mutable view
auto mutable_view = const_view | std::views::as_mutable;
32. std::ranges::cache1
Cache first element.
// Expected C++26: Cache first
#include <ranges>
auto expensive_range = /* expensive to compute */;
// Cache first element
auto cached = expensive_range | std::views::cache1;
33. std::ranges::drop_last and std::ranges::take_last
// Expected C++26: Drop/take last
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Drop last N
auto dropped = vec | std::views::drop_last(2); // {1, 2, 3}
// Take last N
auto taken = vec | std::views::take_last(2); // {4, 5}
34. std::ranges::reverse Improvements
// Expected C++26: Enhanced reverse
#include <ranges>
std::vector<int> vec = {1, 2, 3, 4, 5};
// Reverse view
auto reversed = vec | std::views::reverse;
// Reverse with custom comparator
auto custom_reversed = vec | std::views::reverse_with([](int a, int b) {
return a > b;
});
Summary Table
| Feature | Category | Status |
|---|---|---|
| Static Reflection | Language | Proposed |
| Pattern Matching | Language | Proposed |
| Contracts | Language | Proposed |
| Named Parameters | Language | Proposed |
| Networking Library | Library | Proposed |
std::hive |
Library | Proposed |
std::flat_map |
Library | Proposed |
| Enhanced Ranges | Library | Proposed |
std::ranges::enumerate |
Library | Proposed |
std::ranges::adjacent |
Library | Proposed |
Important Notes
⚠️ C++26 is still in development. Features listed here are based on:
- Current proposals (P-papers)
- Working drafts
- Committee discussions
Features may:
- Change before finalization
- Be deferred to later standards
- Be removed entirely
Check the latest C++ standards documents for authoritative information.
Expected Timeline
- 2024-2025: Feature proposals and refinement
- 2025-2026: Finalization and voting
- 2026: Expected publication
Compiler Support
As C++26 is not yet finalized, compiler support is experimental:
- GCC: Experimental support for some features
- Clang: Experimental support for some features
- MSVC: Experimental support for some features
Use experimental flags: -std=c++2c or -fconcepts-ts (for specific features)
C++26 promises to be another major update, with reflection, pattern matching, contracts, and extensive networking/ranges improvements. Stay tuned for the final standard!