c++ 无法从临时std::array构造std::span

iovurdzv  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(138)

我有下面的代码,我希望它能工作,但它没有:

#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() == Ndata() == std::data(arr)
只有当extent == std::dynamic_extent || N == extenttrue并且从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,因此也满足第二个要求

我看不出有什么理由不能调用这个构造函数。

plicqrtu

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)。

相关问题