2024/5/2(木)

最近本当に生活全般を改善したく、以下のことを試みている。

  • 毎日換気する。
  • 夜10時には風呂に入る。
  • 作業を場所で分ける。(研究は研究室、課題は大学図書館、趣味は自室など)

cpprefjpを読み進めた。「後置戻り値型をプレースホルダーにすることを許可」~「nullptr_t型の定数式を非型テンプレートパラメータとすることを許可」まで。

後置戻り値型をプレースホルダーにすることを許可

一読して主旨がよく分からなかったが、ちょっと考えたら理解できた。戻り値型推論に関して通常関数ならauto以外にauto&とかconst autoみたいなのも行けるところ、ラムダ式だと後置でしか書けない。ので、後置でauto類が使えないとなると「何も書かずauto相当にする」か「型推論を使わず全て書く」しかなくなる。どうやらその問題の解決策のようだ。それに伴って副次的に通常関数も後置戻り値型でautoが使えるようになった。

宣言時のメンバ初期化を持つ型の集成体初期化を許可

えーそれC++11だと通らなかったの。

変数テンプレート

もしかしたら一回も使ったことがないかもしれない。たぶん行けるんだろうという意識は持ちつつ明確にやろうと思ったことが無かった。

動的メモリ確保の省略の許可

そういう最適化の許可不許可とかも仕様で決まってるんだ。

リテラル演算子のスペースを省略可能とする

こまけ~~!そもそもなんでスペースが必要だったんだろう。その方が固定の予約語とプログラマ定義のシンボルで分けてパースしやすかったのかな。

ラムダ式の初期化キャプチャ

これは使ったことがある。というかそうか、C++11だと使えなかったのか。確かに書いてなかった。

ネストする集成体初期化における波カッコ省略を許可

こんな仕様あったんだ。なんでarrayは二重波かっこになるんだ?と思ったけど、要するにstd::arrayの実装は普通にT array<T>::elems[N]みたいなメンバ変数がある感じなので、それに対して単に修正体初期化をやってるだけのようだ。initializer_listを受け取るコンストラクタをstd::arrayに実装するとかじゃいかんかったのか?

実験してみたら、構造体の中に構造体や配列が入っていても全てのメンバについて順に最初から集成体初期化が出来てしまうようだった。こんなこと出来たのか。ただの構造体初期化に見せかけて構造体の中の構造体や配列まで初期化できるのかなりきもくないかという気持ちがある。

ジェネリックラムダ

できるということは知っているが中々使わないんだよなあ。autoが型推論でなくテンプレートのシンタックスシュガーになるのが気持ち悪い。ライブラリでコールバックにラムダ式を渡す際に使うと短く書けたりするが、それで関数中のコードで型が分からなくなるから使いたくないよ。

サイズ付きデアロケーション

混乱している。newで確保されたメモリは、mallocで確保されたメモリがそうであるようにサイズ情報をそれ自体の中には保持しないものだと思っていた。が、挙動を見るに明らかにサイズ情報を含めた分のメモリが確保されている。そしてそのサイズ情報がdeleteの手に渡ってこの挙動が実現されている。一体どこにこんな挙動が規定されているんだ???

nullptr_t型の定数式を非型テンプレートパラメータとすることを許可

意図が分かりかねるが、これはテンプレートの特殊化とかを想定しているのか?

Categories: