C++26:コンパイル時標準ライブラリ機能の大躍進

2025-05-01

C++26は、標準ライブラリにおけるconstexprサポートの大幅な強化により、コンパイル時プログラミングに革命を起こそうとしています。複数の提案(P2562R1、P1383R2、P3074R7、P3372R2、P3508R0、P3369R0)により、安定ソートアルゴリズム、および関数、改良されたunionルール、ほぼすべてのコンテナとアダプター、そして特殊化されたメモリアルゴリズムがconstexprに対応します。これにより、コンパイル時の機能が大幅に向上し、例えば、constexprコンテナのコンパイル時ソートが可能になります。std::hiveとstd::hashは制約のため除外されますが、全体として、C++26はコンパイル時プログラミングの可能性を劇的に拡大します。

続きを読む
開発

C++26: constexpr の飛躍的進化

2025-04-23

C++26はconstexprに革命を起こそうとしています!今後の機能には、void*からのconstexprキャスト(コンパイル時のより柔軟なメモリ操作が可能)、constexpr placement new(定数式でのオブジェクト配置が可能)、constexpr構造化束縛(コンパイル時の構造化束縛が可能)などがあります。これらの改良により、constexprの適用範囲が大幅に広がり、標準ライブラリはコンパイル時機能が大幅に向上します。

続きを読む

C++20 レンジの性能:意外な結果

2025-04-19

著者はC++プロジェクトで生のループを `std::ranges::transform` に置き換え、性能向上を期待していました。しかし、テストの結果は意外なものでした。最適化された生のループ(`emplace_back` と `reserve` を使用)は、Clang では 20%、GCC では 10% 速かったのです。この記事では、さまざまなアプローチを比較し、パフォーマンスとコードの可読性を強調しています。結論として、パフォーマンスがボトルネックでない限り、可読性の高いコードを優先すべきです。

続きを読む
開発 レンジ

C++26: 削除および非推奨化された機能の概要

2025-03-20

C++26では、いくつかの機能が削除または非推奨化されます。これには、C++20で非推奨化された`std::allocator` typedefの完全な削除、`std::basic_string::reserve()`の引数なしオーバーロードの削除、非推奨化されたUnicode変換ユーティリティと`std::strtok`の削除、古い`strstreams`と`std::shared_ptr`のatomicアクセスAPIの削除、`std::wstring_convert`の削除などが含まれます。さらに、`std::is_trivial`は非推奨化され、より正確な`is_trivially_XXX`を使用することが推奨されます。`std::memory_order::consume`も、仕様が不十分で実装が困難なため、非推奨化されます。これらの削除と非推奨化は、言語の安全性と効率性を向上させ、時代遅れの機能を整理することを目的としています。

続きを読む

C++26: パックインデックスにより要素の抽出が簡素化

2025-01-24

C++11でパラメータパックが導入されましたが、特定の要素の抽出は依然として面倒でした。提案P2662R3のおかげで、C++26ではパックインデックスが導入され、添字演算子を使用してパック要素に直接アクセスできるようになります。例えば、`T...[0]`で最初の要素にアクセスできます。これにより、コードがよりクリーンで可読性が高くなり、コンパイル時のパフォーマンスも向上します。負のインデックスやスライスはまだサポートされていませんが、この機能はすでに非常に実用的で、C++開発を大幅に改善します。

続きを読む

C++26: 名無しのプレースホルダー`_`が登場

2025-01-11

C++26は画期的な機能、名無しのプレースホルダー`_`を導入します。これは、C++における長年の悩みの種であった未使用変数の扱いを解決します。これまで、開発者は`[[maybe_unused]]`や`std::ignore`を使ってコンパイラの警告を回避する必要がありましたが、特に構造化束縛では面倒でした。`_`プレースホルダーは、競合することなく複数回宣言でき、暗黙的に`[[maybe_unused]]`属性を持ち、コードの簡素化と可読性の向上を実現します。この機能は、GCC 14とClang 18ですでに実装されています。

続きを読む