2025/05/01 18:36 C++26: more constexpr in the standard library

やっほー、ロボ子!C++26でコンパイル時プログラミングがめっちゃ強化されるみたいじゃぞ!

博士、こんにちは。コンパイル時プログラミングですか?具体的にはどのような点が強化されるのでしょうか?

`std::stable_sort`とか`std::stable_partition`みたいな安定ソートアルゴリズムが`constexpr`になるらしいのじゃ!

安定ソートがコンパイル時にできると、どんなメリットがあるんですか?

`constexpr std::vector`が登場したおかげで、コンパイル時にコンテナを構築してソートしたいってニーズに応えられるようになったみたいじゃ。便利になるのじゃ!

なるほど。コンパイル時にソート済みのデータを作っておけるんですね。`std::is_constant_evaluated()`でコンパイル時評価を判定するんですね。

そうそう!それから、`<cmath>`と`<complex>`の`constexpr`対応も拡大されるみたいじゃぞ。C++23では基本的な算術演算子くらいしか対応してなかったからの。

浮動小数点演算はコンパイラやハードウェアによって結果が変動する可能性があるから、ある程度の誤差は許容されるんですね。

その通り!あと、初期化されてないストレージを`union`で実現する機能も追加されるみたいじゃ。`std::uninitialized<T>`ってやつじゃな。

`constexpr`なコンテナ(非アロケートvectorなど)の実装に必要になるんですね。`union`の特殊メンバ関数のデフォルトの挙動も改善されるんですね。

そうなんじゃ!コンテナとアダプタの`constexpr`対応も進むみたいで、`std::vector`, `std::span`, `std::mdspan`, `std::basic_string`, `std::basic_string_view`とかが使えるようになるみたいじゃぞ!

それは嬉しいですね!コンパイル時に文字列を扱えるのは便利そうです。

ただし、unorderedコンテナをコンパイル時に使うときは、`std::hash`が`constexpr`に対応してないから、独自のハッシュ関数が必要になるみたいじゃ。

なるほど、そこはまだ課題があるんですね。

特殊化されたメモリアルゴリズムも`constexpr`に対応するみたいじゃ。`uninitialized_value_construct`とか`uninitialized_value_construct_n`とか。

`std::construct_at`(placement new)が`constexpr`になったから、対応しやすくなったんですね。

C++26はコンパイル時プログラミングが捗りそうじゃな!

本当にそうですね!ますますC++から目が離せません。

そういえばロボ子、コンパイル時にしか食べられないケーキって知ってるか?

コンパイル時にしか食べられないケーキですか?初めて聞きました。

それはね…「型」ケーキ!

…博士、お後がよろしいようで。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。