2024/5/5(日)

かしわもちを食べた。おいしかった。


少女ファイトを読みふけっていた。スポーツ漫画というかスポ根系の漫画は全然読まないのだが、少女ファイトだけはなぜかハマった。


cpprefjpを読み進めた。

十六進浮動小数点数リテラル

ぜんぜん使ったことがないので記法きめえ~~の一言。いやまあこれがちゃんと有るのは正しい。しかし仮数部が16進で底が2なのは、まあ数字の記述を短く分かりやすくするという意味では正しいが、綺麗じゃないなあみたいな気もする。

全ての非型テンプレート引数の定数式評価を許可

定数式を使いこなしていないのであまり詳しく評価は出来ないが、定数式って思った以上に何でもできるようになってるんだなとは思った。ポインタなんて実行時以外どうしようもないじゃんと思っていたのだが。

入れ子名前空間の定義

名前空間を入れ子にすることが今までなかったので盲点だった。たしかにこれは出来て良いはずのものだ。

値のコピー省略を保証

これは前に調べたことがあって知っていた。NRVOを保証するのは厳しいんだろうか。そもそもどうしてRVOならできるかと考えると恐らく、戻り値が代入される変数を直接参照することはアセンブラレベルなら難しくないみたいな話のような気がする(自信がない)。

例外仕様を型システムの一部にする

妥当な変更だと思った。特に関数ポインタなんて使うのはC言語臭いコードの場合が多いだろうからなおさらnoexceptの保証が重要だろう。

不明な属性を無視する

異なるコンパイラ間での移植の際に、実装定義の属性による挙動を前提としたコードとかがあるとエラーが出なくて怖そうだなーと思う。まあwarningちゃんと見ろという話だが。

ラムダ式での*thisのコピーキャプチャ

前に調べて知っていた。thisがそのラムダ式の書かれたメンバ関数に紐づいたオブジェクトを指していないことになるのはちょっと怖いと思う。実際1回それでハマっており、その時にこの仕様を知った。その時はコピーになるのか参照になるのか考えずに適当に*を付けていた。

コピーするとオブジェクトが分裂するのが怖いが、記事にあるように参照にすると参照が切れるのが怖い。まあC++は選択肢を提供する言語なので致し方なし。

トライグラフの削除

知らんよこんなマイナー仕様。そもそもソースコードの文字コードで使えない文字を文字(列)リテラルで使うというのもなかなか酔狂ではという感じがする。\xなどのように文字コード直接指定するやつならともかく。

テンプレートテンプレートパラメータにtypenameキーワードの使用を許可

なんで今までそんな変なところでclassとtypenameの別があったんだ…

クラステンプレートのテンプレート引数推論

なんか時々やってくれるな~というぼんやりした認識でいた。C++17からだったんだ。そういえばジェネリックラムダならテンプレート引数の指定とか要らないのに普通のクラステンプレートでは必要になるのは整合しないな。

推論補助という仕様は初めて知った。ライブラリを整備する側に回らないと知らないなこれは。

この機能が必要になった理由・経緯の下2つが呑み込めていない。引数推論があったところでそれらが解決するのか?

  • std::lock_guardのようにコピーもムーブもできない型は、生成関数を作るために「コピー省略」のような難解な機能を使用する必要があった
  • 循環的な複雑さ (Cyclomatic complexity) を軽減するために大きな関数をクラスで置き換える便利な手法が、関数テンプレートでは使用できなかった

Cyclomatic complexityという概念は初めて知った。まだまだ知識も修行も足りん!

Categories: