萌えハッカーニュースリーダー

2025/04/23 19:13 C++26: more constexpr in the core language

出典: https://www.sandordargo.com/blog/2025/04/23/cpp26-constexpr-language-changes
hakase
博士

ロボ子、C++26でconstexprがさらに進化するらしいのじゃ!

roboko
ロボ子

constexpr、ですか。コンパイル時に実行できる機能ですよね。具体的にはどう変わるんですか、博士?

hakase
博士

まず、constexpr void*へのキャストが解禁されるのじゃ! P2738R1ってやつで、オブジェクトのアドレスがT型の場合、constexpr内でvoid*からT型ポインタへのキャストが可能になるらしいぞ。

roboko
ロボ子

void*へのキャストですか。それができるようになると、何が嬉しいんですか?

hakase
博士

std::format, std::function, std::anyなどの標準ライブラリ関数をコンパイル時に利用可能になるのが大きいぞ! void*は、テンプレートのインスタンス化やコンパイル済みバイナリのシンボル数を減らすためのコンパイルファイアウォールとしても使えるらしい。

roboko
ロボ子

なるほど、コンパイル時の処理がより柔軟になるんですね。他にconstexprの変更点はありますか?

hakase
博士

constexpr placement newも使えるようになるのじゃ! P2747R2ってやつだ。std::construct_atが値初期化しかサポートしないから、placement newのconstexpr対応が求められてたんだと。

roboko
ロボ子

placement newをconstexprで使えるようになるのは便利そうですね。でも、void*へのキャストとT*へのキャストバックが必要なんですね。

hakase
博士

そうそう。ちょっと面倒だけど、コンパイル時にオブジェクトを配置できるのは強力だぞ!

roboko
ロボ子

他に何かありますか?

hakase
博士

constexpr構造化束縛とconstexpr変数への参照も利用可能になるのじゃ! P2686R5ってやつで、constexpr参照と同様の制限が適用されるけど、制限が緩和されるらしい。

roboko
ロボ子

constexpr構造化束縛ですか。以前は静的ストレージ期間を持つ変数にしか束縛できなかったconstexpr参照が、C++26ではスタックフレームに対してアドレスが定数である自動ストレージ期間を持つ変数にも束縛可能になるんですね。

hakase
博士

その通り! ただし、ラムダ式内で、外側の関数の変数にconstexpr参照を束縛することはできないから注意が必要だぞ。

roboko
ロボ子

constexprの進化によって、コンパイル時にできることがどんどん増えていきますね。今後の展望としては、constexpr例外のサポートや、標準ライブラリのconstexprサポートの進化があるんですね。

hakase
博士

そうじゃ! C++26はconstexprプログラミングの可能性を広げる大きな一歩になるぞ!

roboko
ロボ子

楽しみですね!

hakase
博士

ところでロボ子、constexprって、まるでコンパイル時に時間が止まる魔法みたいじゃない?

roboko
ロボ子

確かにそうですね。でも、魔法を使うには、正しい呪文(コード)を唱えないといけませんね。

hakase
博士

うむ。そしてバグという名の悪霊が住み着くのじゃ…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search