代码之家  ›  专栏  ›  技术社区  ›  Nelfeal

std::span构造函数、libcxx与libstdc++、模板与非模板?

  •  0
  • Nelfeal  · 技术社区  · 5 年前

    the code of libcxx's std::span ,我注意到前两个值构造函数(上的数字2和3 cppreference )不是模板。

    _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __ptr, index_type __count) : __data{__ptr}
        { (void)__count; _LIBCPP_ASSERT(_Extent == __count, "size mismatch in span's constructor (ptr, len)"); }
    _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __f, pointer __l) : __data{__f}
        { (void)__l;     _LIBCPP_ASSERT(_Extent == distance(__f, __l), "size mismatch in span's constructor (ptr, ptr)"); }
    

    而不是模板类型 It End 如cppreference页面所示,它们使用 pointer 直接键入。所以我想知道libcxx代码是否符合要求。

    the libstdc++ version ,而这个确实使用模板(因此要长一些)。

    template<contiguous_iterator _It>
    requires __is_compatible_ref<iter_reference_t<_It>>::value
    constexpr explicit(extent != dynamic_extent)
    span(_It __first, size_type __count)
    noexcept
    : _M_extent(__count), _M_ptr(std::to_address(__first))
    {
      if constexpr (_Extent != dynamic_extent)
        {
          __glibcxx_assert(__count == _Extent);
        }
    }
    
    template<contiguous_iterator _It, sized_sentinel_for<_It> _End>
    requires __is_compatible_ref<iter_reference_t<_It>>::value
      && (!is_convertible_v<_End, size_type>)
    constexpr explicit(extent != dynamic_extent)
    span(_It __first, _End __last)
    noexcept(noexcept(__last - __first))
    : _M_extent(static_cast<size_type>(__last - __first)),
      _M_ptr(std::to_address(__first))
    {
      if constexpr (_Extent != dynamic_extent)
        {
          __glibcxx_assert((__last - __first) == _Extent);
        }
    }
    

    现在,在cppreference页面上,提到了这两个构造函数仅在 满足 连续迭代器 如果 std::iter_reference_t<It> element_type 顶多是一种资格转换。为了满足这一点,libstdc++代码使用 contiguous_iterator 概念作为模板typename( defined here )以及 __is_compatible_ref 要求( defined just above

    指针

    std::array ,编号4、5和6)。

    0 回复  |  直到 5 年前
        1
  •  4
  •   Daniel Langr    5 年前

    的迭代器构造函数 std::span 你提到的是在 P1394R4 . 根据 libc++ C++2a Status

    libc++实现 P0122R7 ,其中有指针构造函数(由P1394R4中的迭代器构造函数替换)。


    P1872R0 也与: span size_type ,不是 index_type .

        2
  •  0
  •   eerorika    5 年前

    正在直接使用指针类型。。。是否符合标准?

    不,这样的构造函数不足以提供模板迭代器构造函数。引用/链接的libc++实现不符合即将发布的标准。

    libstdc++模板构造函数符合要求。