2024/5/12(日)

cpprefjpを読み進めた。

可変引数が空でない場合のトークン置換

マクロメタプログラミングに慣れていないので可変引数マクロも使ったことがないが、使いこなせば便利そう。

可変サイズをもつコンテナのconstexpr化

ついに、といった感じ。これのためにコンパイル時のnew/deleteを許可したという。

「コンパイル時に確保したメモリを実行時に持ち越すことはできない」ということを一瞬当たり前だろ!!と思ったが、よく考えたらそれはつまりコンパイル時に作成したvectorやstringの値を実行時に持ってこれないということだ。これはそれなりに痛い制約である。つまりvectorやstringを計算過程として持って最終的にintやboolのような値だけ作ることのみが許されている訳だ。うーーーん。

実験してみたら実際、vectorやstringで適当な変数を作ってそのサイズを返すconstexpr関数などは許されたが、vectorやstringそのものを返すのはエラーが出た。仕様通りだ。string::c_str()を返すのもアウトだった。そりゃそうだよね。

即時関数

consteval、噂は聞いていたのだがあまり実態を知らなかった。思ったより内容は簡単だった。constexprがコンパイル時計算を「可能なら求める」のに対し、constevalは「絶対に強制させる」のだ。出来ないならコンパイルエラーになる。

初期化式をともなう範囲for文

あんまり意識したことが無かったが、ちゃんと使えば強そう。特にインデックスも欲しいケースでの書き方はだいぶアリ。しかし、同時に型の違う複数の変数を宣言出来ないのはちょっと残念かも?それは普通のforやif、switchでもそうだが。構造化束縛使えばいけるいける!!

入れ子名前空間定義でのインライン名前空間

あれば便利であろうちょい便利機構。

丸カッコの値リストからの集成体初期化を許可

集成体初期化をコンストラクタの形でもやれるようになった、という風に思えばいいのだろうか。しかしコンストラクタが生成されている訳でもないらしい。一様初期化は使うのは難しくないが立ち位置が難しすぎて今一つ整理しきれていない。

  • 構造体の初期化
    • コンストラクタ呼び出しによる初期化
    • 一様初期化
      • 波かっこによるもの
      • 丸かっこによるもの
  • 構造体の初期化の呼び出し
    • 波かっこ
      • 一様初期化
    • 丸かっこ
      • コンストラクタ呼び出し
      • 一様初期化

一貫比較

噂には聞いていて知っていた。使ったことはない。順序の定義が重要になるようなコードを書いたことが無い。数学系ライブラリの開発とかだと嬉しいのだろうか。

ラムダ式の初期化キャプチャでのパック展開を許可

よく分からない理由で今までダメとされていたが、よく分からない理由でだが今は違う!!ギュッ!!となったらしい。CWG1760とやらを読めば分かるようだ。いずれ読む。

ラムダ式のキャプチャとして[=, this]を許可する

純粋な可読性の向上なんだ。確かに言われてみればthisをキャプチャするのかしないのかがぱっと見分からないのは若干イヤかもしれない。

ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止

法の抜け穴を塞いだ感じのようだ。

Categories: