C++20

[C++]コンセプトの文脈におけるmeet、satisfyとmodelの使い分けについて

この3つの言葉はどれも、あるコンセプトもしくは制約を満たすという意味で使われています。同じ意味のように思えますが標準ライブラリ中では明確な使い分けがなされています。 old conceptに対するmeet syntactic conceptに対するsatisfy semantic conceptに…

[C++]宇宙船演算子のフォールバック処理

宇宙船演算子の導入によって比較演算子の定義が著しく楽になります。ただ、テンプレートな所ではそう単純にはいかない事もあります。 template<typename T> struct wrap { T v; auto operator<=>(const wrap&) const = default; //Tが<=>を持っていなかったら? //Tが参</typename>…

[C++]コンセプトの5景

C++20にてついに導入されたコンセプト、書け方にムラがあるので少し整理してみます。 1. typenameの代わりに 2. 前置requires節 3. 後置requires節 ※関数のみ 4. autoによる簡略構文 ※関数のみ 5. 1と2(or 3) 4と3 全部盛り 参考文献 謝辞 1. typenameの代わ…

[C++]Deprecating volatile を見つめて

※この記事はC++20を相談しながら調べる会 #3の成果として書かれました。 C++20より、一部のvolatileの用法が非推奨化されます。提案文書は「Deprecating volatile」という壮大なタイトルなのでvolatileそのものが無くなるのかと思ってしまいますがそうではあ…

[C++]構造化束縛の動作モデルとラムダキャプチャ

一部のコンパイラでは構造化束縛宣言で導入された変数をラムダ式によってキャプチャすることができません。 実は、厳密に規格にのっとればC++17ならば出来ない、C++20からはできる、が正しい動作になります。 ただ、規格を眺めてもC++17でできず、C++20でき…

[C++]expression-equivalentのお気持ち

expression-equivalent?? 標準ライブラリへのRangeの導入に伴って新たに追加された言葉で、次のように定義されています。 expressions that all have the same effects, either are all potentially-throwing ([except.spec]) or are all not potentially-th…

[C++]constinit?🤔

constinit指定子 静的変数の初期化 定数初期化(constant initialization) 定数初期化コンストラクタ 動的初期化の静的初期化への切り替え constinitの効能 利用例 const一族 参考文献 constinit指定子 constinit指定子はC++20より変数に付けることができる…

[C++]モジュール理論 上級編(魔境編)

※この記事はC++20を相談しながら調べる会 #2の成果です。 ※この内容はC++20より有効なものです。C++20正式策定までの間に内容が変化する可能性があります。 importとmoduleというキーワード プリプロセッサの扱い マクロのエクスポート 名前が可視でなければ…

[C++]モジュール理論 基礎編

※この記事はC++20を相談しながら調べる会 #2の成果です。 ※この内容はC++20より有効なものです。C++20正式策定までの間に内容が変化する可能性があります。 より読みやすい解説がすでにあるのでそちらにも目を通されるといいと思われます。→ モジュール - cp…

[C++]explicit(bool)の使いどころ

※この内容はC++20から利用可能になる予定の情報であり、一部の内容が変更される可能性があります。 explicit(bool)指定子 従来コンストラクタと変換関数に付けることのできていたexplicit指定子は 、C++20よりexplicit(expr)という形のものに置き換えられま…

[C++]丸かっこによる集成体初期化

※この記事はC++20を相談しながら調べる会 #1の成果です。 ※内容はC++20正式策定までに変化する可能性があります。 コンストラクタとの競合 縮小変換の許可 ネストするかっこの省略(できない!) 一時オブジェクトの寿命延長(されない!) 少し詳細な考察 D…

[C++]非型テンプレートパラメータたりうるには

※この内容はC++20より有効なものです。現行(C++17)ではまだ1ミリも利用可能な情報ではありません。また、随時記述が変更される可能性があります。 こちらの記事との関連があるので、予め目を通しておくと良いかもしれません。 onihusube.hatenablog.com 非…

[C++] constexpr関数がインスタンス化されるとき

「P0859R0 評価されない文脈でconstexpr関数が定数式評価されることを規定」を理解するためのメモです。 以下の文章内でのconstexpr関数についてのインスタンス化という言葉はテンプレートにおけるインスタンス化と同じ意味、すなわちconstexpr関数の定義の…

[C++] constexprなメモリの確保と解放のために(C++20)

※この内容はC++20から利用可能予定の情報であり、内容が変更される可能性があります。また、constexprなアロケータを作る類の内容ではないです。 前回の記事の「コンパイル時メモリアロケーション」の所に入りきらなかったP0784の内容をまとめたものです。 c…

[C++]さらに出来るようになったconstexpr(C++20)

※この内容はC++20から利用可能になる予定の情報であり、一部の変更がC++23以降に先延ばしになるなど、内容が変更される可能性があります。 C++11でconstexprが導入されて以降、あらゆる処理をconstexprで行うことを目指すかのように(おそらく実際そう)cons…

[C++]集成体の要件とその変遷

集成体(aggregate)とは配列と幾つかの条件を満たしたクラス(union含む)の事で、集成体初期化(aggregate initialization)を行えるような型のことです。一様初期化構文の導入によってその他の初期化との見た目の差異が無くなりあまり意識されなくなった…

[C++]素敵な宇宙船演算子(<=>)

※この内容はC++20より有効なものです。現行(C++17)ではまだ1ミリも利用可能な情報ではありません。また、随時記述が変更される可能性があります。 Spaceship Operator(宇宙船演算子)とは 自動生成される演算子 対称性 default実装 暗黙deleteされるケー…