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

为什么我不能压缩一个左值生成器?

  •  2
  • Carsten  · 技术社区  · 1 月前

    以下简单程序编译并工作:

    std::generator<int> get_ints(int n)
    {
        for (int i{0}; i < n; ++i)
            co_yield i;
    }
    
    int main(int argc, char* argv[])
    {
        std::vector<float> floats { 0.0f, 1.0f, 2.0f, 3.0f };
    
        for (auto [i, f] : std::views::zip(get_ints(4), floats))
            std::println("{}: {}", i, f);
    }
    

    但是,如果我将生成器存储在变量中并尝试相同的操作,它将无法编译:

    
    std::generator<int> get_ints(int n)
    {
        for (int i{0}; i < n; ++i)
            co_yield i;
    }
    
    int main(int argc, char* argv[])
    {
        std::vector<float> floats { 0.0f, 1.0f, 2.0f, 3.0f };
        auto ints = get_ints(4);
    
        for (auto [i, f] : std::views::zip(ints, floats))
            std::println("{}: {}", i, f);
    }
    

    据我所知,这是失败的,因为 std::ranges::viewable_range<std::generator<int>&> 评估为 false ,而 std::ranges::viewable_range<std::generator<int>&&> 评估结果为true。但为什么第一种情况被禁止?我知道 generator 它不是一个范围,但它的行为就像我测试过的其他所有范围类型(尽管我只测试了一些)在作为左值引用传递时都满足这个约束。那么为什么做 发电机 在这种情况下特别吗?

    1 回复  |  直到 1 月前
        1
  •  3
  •   康桓瑋    1 月前

    std::generator 只是一个动作 range 对于已删除的复制构造函数,您需要将其移动到 zip_view :

    for (auto [i, f] : std::views::zip(std::move(ints), floats))
        std::println("{}: {}", i, f);
    
    推荐文章