2024/6/20(木)
cpprefjpを読み進めた。
<initializer_list>
- constructor, destructor: はい
- size: はい
- begin, end: 普通のポインタを返すのは少し非自明かもしれない。
- value_type: はい
- reference, const_reference: なぜreferenceにもconstが?
- size_type: この手の型がsize_t以外であることがあるのだろうか。
- iterator, const_iterator: こちらもiteratorにもconstが付いている。基本的にinitializer_listは初期化時の状態でひとまとまりであり、後から要素個別に変更するものではないという想定なのかもしれない。
<compare>
比較カテゴリ型
「比較カテゴリ型」というのは三方比較演算子<=>
の戻り値型のことらしい。
- partial_ordering: 半順序。「比較不能」が存在する。
- weak_ordering: 弱順序。
<
でも>
でもないが等しくはない、平たく言うと「同レベル」みたいな関係が存在する。「比較不能」は存在しない。 - strong_ordering: 全順序。一番普通のやつ。
ややこしいことに、比較カテゴリ型にもoperator<
などの比較演算子が定義されている。これは整数値0
と比較することで結果を取得できるというものらしい。0
以外と比較した場合は未定義。気になるのは比較不能unordered
がどういう挙動になるかだが、これは何をやってもfalse
になるようだ。
また、weak_ordering
はpartial_ordering
に、strong_ordering
はpartial_ordering
とweak_ordering
の両方に変換できるらしい。strong_ordering
が変換できるのは包含関係から当然として、weak_ordering
がpartial_ordering
に変換できるのはちょっとよく分からない。反対称律を満たさない関係を満たす関係に変換できてしまっていいのか???
三方比較の結果型
要するに比較カテゴリ型を導く型テンプレート関数のようだ。
- common_comparison_category: 与えられた全ての型から変換できる共通の型を導く。これの仕様を見てもどうやら
strong_ordering
<weak_ordering
<partial_ordering
という包含順序が前提になっているらしい。weak_ordering
とpartial_ordering
は相互で変換不能だと思うのだが。 - compare_three_way_result: ある型の比較結果型を求める。これは
<=>
の定義から自動で導かれるのでユーザが明示的に特殊化してはならない。
コンセプト
- three_way_comparable: ある型Tに対し三方比較をしてある比較カテゴリ型
Cat
に変換できる、というコンセプト。 - three_way_comparable_with: 「ある型T」ではなく、「ある2つの型T,Uに対し」のバージョン。
名前付きの比較関数
- is_eq, is_neq: はい
- is_lt, is_lteq, is_gt, is_gteq: LaTeX使いとしては、lteqとgteqはleqとgeqにならんかったんかと思ってしまう。
比較関数オブジェクト
- compare_three_way: 普通に三方比較演算子の関数バージョンに見えるが、どう違うのだろう?
- strong_order, weak_order, partial_order: 比較結果の型を縛った三方比較のようだ。
- compare_strong_order_fallback, compare_weak_order_fallback, compare_partial_order_fallback: 上記の比較のちょっと型に対する要請が弱いバージョンっぽい?
Categories: 未分類