2024/5/20(月)

cpprefjpを読み進めた。

コンセプト

一応以前にざっと仕様の確認はしたが、結局使ってないので覚えれていない。実は割と直交する複数の機能がまとめて導入されたものとして理解した方がいいと個人的には思っている。

  • requires式: 単にbool型の値をもつ定数式。型に対するいろいろな要件を書くことで、ある型がその要件を満たすならばtrue、という定数式を表現できる。
    • 単純要件: ある式がコンパイルエラーを起こさないという要件。
    • 型要件: ある型が存在するという要件。typenameで始める。
    • 複合要件: ある式がコンパイルエラーを起こさず、また式の値が指定のものとなるという要件。{ 式 } -> 型の形で書く。型指定にはconceptを使える。
    • 入れ子要件: ある定数式がtrueとなるという要件。requiresで始める。
  • concept: 型→bool値の関数。
  • requires節: テンプレートや関数の定義時に、型に対する要求を指定するための記法。

requiresというキーワードが文脈次第で3つもの別の意味になるのがすごい。すごいというかひどい。

自分はそれなりの規模のプロジェクトだと型の抽象化を抽象クラスによるインターフェースで表現してしまいがちなので、全然コンセプトとテンプレートを使う機会がないのだが、C++20の設計思想としては#includeとヘッダファイルではなくモジュールをもっと積極的に活用してそこでコンセプトとテンプレートによる静的解決をやっていってねという感じなのだろうか。

静的な診断メッセージの文字エンコーディング

コンパイル時の世界は実行時の世界に不必要に制約される必要はない、というお達し。しかしコンパイル時と実行時で文字コードが違う世界と言うのは未だに(多分)お目にかかったことがないのでピンとこない。組込みとかで実は知らないうちに目にしてるんだろうか。

複合文の末尾へのラベルを許可

それ今まで許可されてなかったのか。C++たまによく分からない部分で制約がある。

行末スペースを無視するよう規定

こまけー仕様だが、確かにこれは明確化しておいた方がよい。

継承コンストラクタからのクラステンプレート引数の推論

これは便利だが、コンパイラ屋さんは大変だな。エイリアステンプレートからの推論がC++20で導入されていたが、関連してそうな話題だ。

範囲for文が範囲初期化子内で生じた一時オブジェクトを延命することを規定

これは便利かもしれないが、ちょっと条件が不明瞭過ぎないか?案の定論争が起きてるっぽいし。下手にプログラマーに甘くしようとして動作が不明瞭になるくらいなら、シンプルな仕様で動作に一貫性を持たせた方がよいと思う。


筋トレをした。今日は腕立て。

4日前にスクワットをしたときの筋肉痛が取れなさ過ぎて休んでいたが、ここまで休まなくてよかったし他の部位は遠慮なく鍛えて良かった気がする。


英語の聞き取り訓練も兼ねて、Vulkanの講演動画を見た。

Introductionなので知ってた話題も多く、6割くらいは聞き取れた気がするが、逆に言えばこれですらそれくらいしか聞き取れないので厳しい。

Categories: