C++20 std::span转换构造函数的其他合法用法问询
std::span的跨类型限定转换构造函数及扩展用法
首先给出该转换构造函数的声明:
template<class OtherElementType, size_t OtherExtent> constexpr explicit(see below) span( const span<OtherElementType, OtherExtent>& s) noexcept;
该构造函数生效需满足is_convertible_v<OtherElementType(*)[], element_type(*)[]>约束(仅允许OtherElementType到element_type的限定转换,即仅涉及const/volatile这类cv限定符的增减组合)。除了题目中提到的静态/动态span互转、非const转const的典型用法外,还有以下几类合法用法:
非volatile span转volatile span
可将普通类型的span转换为带volatile限定的span,适用于处理内存映射IO等易变内存区域的场景:int arr[]{1,2,3}; span<int> s{arr}; span<volatile int> sv{s}; // 普通int span转volatile int span非volatile span转const volatile span
一次性添加const和volatile双重限定,适用于既需要只读访问又要处理易变内存的场景:int arr[]{1,2,3}; span<int> s{arr}; span<const volatile int> scv{s}; // 普通int span转const volatile int spanvolatile span转const volatile span
给已带volatile限定的span添加const限定,确保对易变内存的只读访问:volatile int v_arr[]{1,2,3}; span<volatile int> sv{v_arr}; span<const volatile int> scv{sv}; // volatile int span转const volatile int span静态维度的cv限定组合转换
静态大小的span之间也支持各类cv限定的转换,同时保留原有的固定大小信息:int arr[]{1,2,3}; span<int, 3> sf{arr}; span<volatile int, 3> svf{sf}; // 静态普通int span转静态volatile int span span<const volatile int, 3> scvf{svf}; // 静态volatile int span转静态const volatile int span动态与静态维度间的cv限定组合转换
静态span和动态span之间的转换也可以结合cv限定符的变化,只要动态span的实际大小匹配静态span的固定大小:int arr[]{1,2,3}; span<int, 3> sf{arr}; span<const volatile int> scvd{sf}; // 静态普通int span转动态const volatile int span span<volatile int> svd{arr, 3}; span<const volatile int, 3> scvf2{svd}; // 动态volatile int span转静态const volatile int span(大小匹配)
内容的提问来源于stack exchange,提问作者cbhattac
相关产品推荐
相关产品推荐

