首页 > 解决方案 > 为什么简单的迭代器不可读?

问题描述

此代码不能用range-v3 0.10.0(或用master)编译。它确实与range-v3 0.9.1.

#include "range/v3/all.hpp"

struct double_it {
  using value_type = double;
  double x;
  double& operator*() { return x; }
  const double& operator*() const { return x; }
};
static_assert(ranges::readable<double_it>);

哪个版本是对的?在master中,类型Ireadablesame_as<iter_reference_t<I const>, iter_reference_t<I>>。我不明白为什么返回类型operator*应该与operator* const.

注意:在 github 上提交的问题here

标签: c++range-v3

解决方案


range-v3与 Ranges TS 工作草案相比,这似乎至少是不一致的。

关于为什么将这些same_as谓词添加到issue 1449readable中的迭代器概念中的描述非常稀疏。range-v3

使用 /std:c++17 获取使用 msvc 19.24.28319 编译的范围库

...

- CPP_concept_fragment(readable_, (I),
+ CPP_concept_fragment(readable_,
+     requires (/*I const i*/) //
+     (
+         // { *i } -> same_as<iter_reference_t<I>>;
+         // { iter_move(i) } -> same_as<iter_rvalue_reference_t<I>>;
+         0
+     ) &&
+     same_as<iter_reference_t<I const>, iter_reference_t<I>> &&
+     same_as<iter_rvalue_reference_t<I const>, iter_rvalue_reference_t<I>> &&
      common_reference_with<iter_reference_t<I> &&, iter_value_t<I> &> &&
      common_reference_with<iter_reference_t<I> &&,
                            iter_rvalue_reference_t<I> &&> &&
      common_reference_with<iter_rvalue_reference_t<I> &&, iter_value_t<I> const &>
  );

似乎same_as概念实现中的谓词旨在实现以下要求:

// { *i } -> same_as<iter_reference_t<I>>;
// { iter_move(i) } -> same_as<iter_rvalue_reference_t<I>>;

range/v3/iterator/concepts.hpp甚至在此实现更改之前就已经存在(如 中的注释)。

但是,afaics,这些要求都没有出现在Ranges TS的 [iterators.readable] 的工作草案中(也没有出现在生成先前链接草案的 ericniebler/stl2的当前版本中)。HEAD

[iterators.readable] 概念可读

Readable 概念由通过应用 operator* (包括指针、智能指针和迭代器)可读的类型来满足。

template <class In>
concept bool Readable =
  requires {
    typename value_type_t<In>;
    typename reference_t<In>;
    typename rvalue_reference_t<In>;
  } &&
  CommonReference<reference_t<In>&&, value_type_t<In>&> &&
  CommonReference<reference_t<In>&&, rvalue_reference_t<In>&&> &&
  CommonReference<rvalue_reference_t<In>&&, const value_type_t<In>&>;

将其报告为一个问题可能是一个好主意,以至少理清range-v3实现似乎与[iterators.readable]Ranges TS 不同的原因。


推荐阅读