相关疑难解决方法(0)

为什么范围的算法与std的迭代器不兼容?

#include <vector>
#include <iostream>
#include <range/v3/all.hpp>

int main()
{
    auto coll = std::vector{ 1, 2, 3 };

    ranges::copy(
        coll,
        ranges::ostream_iterator<int>{  std::cout, ", " }
    ); // ok

    ranges::copy(
        coll, 
        std::ostream_iterator<int>{ std::cout, ", " }
    ); // error 
}
Run Code Online (Sandbox Code Playgroud)

问题显示在上面的代码中.我使用range-v3-0.3.7.

对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可.

如果是这样,为什么范围的算法不与std的迭代器兼容?

c++ iterator c++-concepts range-v3 c++20

11
推荐指数
1
解决办法
528
查看次数

迭代器概念比相应的命名要求弱,哪些适用于非范围标准算法?

在 C++20 中,我们得到了迭代器类别的概念,例如std::forward_iterator对应于命名需求ForwardIterator。

它们并不等同。在某些(但不是全部)方面,这些概念较弱:

  • (1) “与 [ForwardIterator 或更严格的] 要求不同,[相应的] 概念不需要取消引用来返回左值。”

  • (2) “与 [InputIterator] 要求不同,该input_iterator概念不需要equality_comparable,因为输入迭代器通常与哨兵进行比较。”

  • ...

新std::ranges算法似乎使用这些概念来检查迭代器要求。

但是其他标准算法呢?(C++20 之前就已存在)

他们在 C++20 中是否仍使用与 C++20 之前相同的迭代器要求,或者对它们的要求是否放宽以匹配概念?

c++ language-lawyer c++20

5
推荐指数
1
解决办法
196
查看次数

标签 统计

c++ ×2

c++20 ×2

c++-concepts ×1

iterator ×1

language-lawyer ×1

range-v3 ×1