C++20 协程和 iostream

C++20 Coroutines and iostream

我正在研究 C++ 20 的协程。该示例使用 clang++ 编译。

我遇到的编译器错误是

error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream') and 'cppcoro::generator')

关于下一行

std::cout << numbers << " ";  

截取的完整代码如下所示:

#include <thread>
#include <iostream>
#include <vector>
#include <cppcoro/generator.hpp>

using namespace std;

// coroutine
cppcoro::generator<int> generatorForNumbers(int begin, int inc = 1) 
{
  // for Schleife ohne Abbruchbedingung
  for (int i = begin;; i += inc) 
  {
    co_yield i;
  }  
}

int main() 
{

    auto numbers = generatorForNumbers(-10);                 
  
    for (int i= 1; i <= 20; ++i)
    {
        std::cout << numbers << " ";       
    }
  
    std::cout << "\n\n";
        
    // inline works
    for (auto n: generatorForNumbers(0, 5))
    {
        std::cout << n << " ";  
    }

    std::cout << std::endl;
}

可在此处找到截取的可执行代码: https://godbolt.org/z/4cxhqxPP7

根据 cppcoro::generator 的文档,您可以对生成器执行的唯一“有意义的”操作是通过 begin()end() 获取开始和结束迭代器。这正是您第二次使用 for (auto n : generatorForNumbers(0, 5)) 的原因。它遍历生成器。尽管从技术上讲您遇到了未定义的行为,因为生成器没有停止条件,因此它会溢出 int.

不能直接打印生成器。你必须迭代它。所以你可以这样做:

auto numbers = generatorForNumbers(-10);

auto it = numbers.begin();
for (int i= 1; i <= 20; ++i)
{
    std::cout << *it << " ";
    ++it;
}

或更好(在我看来):

int i = 0;
for (auto n : generatorForNumbers(-10))
{
    if (++i > 20)
        break;
    std::cout << n << " ";
}

甚至更好地使用范围(感谢评论中的@cigien):

for (auto n : generatorForNumbers(-10) | std::views::take(20))
{
    std::cout << n << " ";
}