c++ - 为什么简单的迭代器不可读?
问题描述
此代码不能用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
中,类型I
仅readable
当same_as<iter_reference_t<I const>, iter_reference_t<I>>
。我不明白为什么返回类型operator*
应该与operator* const
.
注意:在 github 上提交的问题here。
解决方案
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 不同的原因。
推荐阅读
- phpstorm - 在 PhpStorm 代码检查中忽略函数的多个定义
- macos - 使用--network = host在MacOS上运行docker容器时如何访问主机上的端口?
- python - 在熊猫数据框中附加两列的最小值
- python - 我正在尝试为 python3.7 获取项目
- javascript - 如何使用 Lodash 根据对象的嵌套属性值选择对象的属性?
- import - 在 teraform 中,有没有办法在不使用 CLI 命令的情况下使用 TF 文件刷新资源状态?
- python - bt - Python 的灵活回测 - 如何获得每个给定日期的总投资组合价值/结果?
- javascript - reactjs如何在子组件中进行动态路由?
- parallel-processing - 暂存空间与主节点磁盘空间中的普通磁盘空间有何不同?
- python - discord.ext.commands.errors.ExtensionNotFound:无法加载扩展“cogs.random”