我有下面的代码,我希望它能工作,但它没有:
#include <array>
#include <span>
auto f = std::span<int>(std::array<int, 3>{});
clang编译失败:
error: no matching conversion for functional-style cast from 'std::array<int, 3>' to 'std::span<int>'
auto f = std::span<int>(std::array<int, 3>{});
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: candidate template ignored: constraints not satisfied [with _Tp = int, _ArrayExtent = 3]
span(const array<_Tp, _ArrayExtent>& __arr) noexcept
^
我希望它能调用构造函数:
template< class U, std::size_t N >
constexpr span( const std::array<U, N>& arr ) noexcept; // (6)
4-6)构造一个span,它是数组arr上的视图;得到的跨度具有size() == N
和data() == std::data(arr)
。
只有当extent == std::dynamic_extent || N == extent
是true
并且从std::remove_pointer_t<decltype(data(arr))>
到element_type
的转换至多是限定转换时,这些重载才会参与重载解析。
为什么不满足此构造函数的约束?
extent == std::dynamic_extent
,因此显然满足了第一个要求std::remove_pointer_t<decltype(data(arr))>
是int
,它等于std::span<int>::element_type = int
,因此也满足第二个要求
我看不出有什么理由不能调用这个构造函数。
1条答案
按热度按时间plicqrtu1#
限定转换只能使某些内容更加const限定。
decltype(data(arr))
是const int*
,const std::array<int, 3>&
。const int
无法通过限定转换转换为int
。但是
std::span<const int>(std::array<int, 3>{})
确实可以工作(const int
->const int
)。