Microsoftがgithubで公開しているstd::spanのコードを読んでいて、意図がわからない箇所がありました。
https://github.com/microsoft/STL/blob/master/stl/inc/span
293行目から始まる_Is_span_convertible_rangeの実装を以下に抜粋します:
C++
1template <class _Rng, class _Ty> 2struct _Is_span_convertible_range 3 : bool_constant<is_convertible_v<remove_pointer_t<decltype(_STD data(_STD declval<_Rng&>()))> (*)[], _Ty (*)[]>> {};
ここでis_convertible_vの内容を単純に解釈すると、おそらく隣接コンテナであろう_Rngの要素型の配列へのポインタ型を、_Tyの配列へのポインタ型に変換可能であるかどうかを判定していると思います。
で、これはspanのコンストラクタでSFINAEのために利用しています。例えば452行目:
C++
1template <class _Rng, enable_if_t<_Is_span_compatible_range<_Rng, element_type>, int> = 0> 2constexpr explicit(_Extent != dynamic_extent) span(_Rng& _Range) 3 : _Mybase(_STD data(_Range), static_cast<size_type>(_STD size(_Range))) { 4}
ここで疑問なのは、span<T>に対してTの隣接コンテナから構築することは当然として、このSFINAEはなぜそれをストレートに書いてないのか?ということです。
C++
1is_same_v<remove_pointer_t<decltype(std::data(std::declval<_Rng&>()))>, T>
とか書かないのは何故なのでしょうか?
https://cpprefjp.github.io/reference/span/span/op_constructor.html
の(7)では「この制約の意図は、イテレータ参照型から element_type への修飾変換のみを許可すること」とあります。つまるところ、非constなTの隣接コンテナからspan<T const>を作るためでしょうか。
ご存じの方がいらっしゃったら、教えて頂きたく。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/20 08:30 編集