为什么view_interface::data const 重载需要额外检查const D 是否满足ranges::range?

康桓瑋*_*康桓瑋 7 c++ c++20 std-ranges

根据[view.interface],非常量和常量重载data函数定义如下:

template<class D>
  requires is_class_v<D> && same_­as<D, remove_cv_t<D>>
class view_interface : public view_base {
private:
  constexpr D& derived() noexcept {                   // exposition only
    return static_cast<D&>(*this);
  }
  constexpr const D& derived() const noexcept {       // exposition only
    return static_cast<const D&>(*this);
  }
public:
  constexpr auto data() requires contiguous_­iterator<iterator_t<D>> {
    return to_address(ranges::begin(derived()));
  }
  constexpr auto data() const
    requires range<const D> && contiguous_­iterator<iterator_t<const D>> {
      return to_address(ranges::begin(derived()));
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么data() const需要另外满足const D是 a ranges::range?不是iterator_t<const D>已经受到限制,所以const D必须是一个ranges::range

requires range<const D>这里的真正目的是什么?有一种情况Dranges::rangeconst D不是ranges::range