Deduction)のあれこれ。En...>では、各次元の要素数(En)はコンパイル時定数/実行時動的指定(std::dynamic_extent)のいずれかとなる。R>)に型推論される。2024-05-02:C++2c(C++26)ではP3029R1が採択され、整数リストによる要素数リスト指定CTADにて動的/固定サイズ混在が可能となる(C++23時点では動的サイズ固定)。std::submdspan関数(→id:yohhoy:20240201)へのスライス指定仕様との一貫性向上。デフォルトコンストラクタ動的要素数次元を含む場合のみデフォルト構築可能。CTAD利用時のインデクス型(mdspan::index_type)は推論ガイドによりsize_tとなる。事前条件(Preconditions)違反のためUBを引き起こす。動的サイズspanは指定不可C++2c:要素数リスト指定コンストラクタ(CTAD)2024-05-02追記:C++2c以降は要素数リストにおいて整数定数(std::integral_constant互換の定数値)を与えると、対象次元の要素数を固定サイズに推論させることができる。固定サイズから動的サイズへは常に安全に変換可能。動的サイズから固定サイズへはサイズ情報が一致していれば変換可能。事前条件(Preconditions)違反のためUBを引き起こす。C配列型からの変換(CTAD)1次元C配列型のみ直接変換がサポートされる。2次元以上のC配列型からのmdspan構築はコンパイルエラーとなるか、要素アクセス時に未定義動作を引き起こす。配列先頭要素ポインタからの変換は意図しない結果をもたらす。double[4]型の4要素配列に対する2次元ビュー(4x4=16要素)を構築する。2>>>型に推論される。double[4][4]型をdouble[16]型として扱うため厳密にはUBとなる。コンストラクタ(CTAD)メモリ領域ポインタとstd::extents/std::dextents*2を指定すると、任意の次元数(rank)と要素数(extents)をもつmdspan型を推論可能となる。CTADを用いるメリットは小さいが、第1引数のポインタ型から要素型(mdspan::element_type)が推論される。major)std::layout_leftレイアウトから汎用ストライドstd::layout_strideレイアウトへは常に安全に変換可能。異種レイアウト間変換においては、マッピングのずらし幅(stride)に互換性があるケースに限って変換可能。注:std::mdspanは実データに対する「ビュー」にすぎない。行列の転置(transpose)をmdspan型変換のみで実現することはできない。事前条件(Preconditions)違反となってUBを引き起こす。次元数1ではlayout_right/layout_leftレイアウトは同一その他のコンストラクタ(CTAD)前掲以外のCTADとして、下記の実引数からのmdspan型推論がサポートされる。yohhoyの日記https://gist.github.com/yohhoy/452a3c5d9132182f409df49f3b541028*1:C配列型からの推論ガイドでは固定サイズ1次元ビューへと推論される。クラステンプレートの別名(alias)として定義される。1注目記事はてなブログをはじめよう!yohhoyさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。