C++20 协程和 iostream

标签 c++ iostream clang++ c++-coroutine

我正在研究 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 << " ";
}

关于C++20 协程和 iostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67324038/

相关文章:

c++ - 在内存分配方面哪个更好 - 子对象或指向单独对象的指针?

c++ - 检测结构是否有填充

c++ - 将窄 (char) 输入流重新解释为宽 (wchar_t) 流

c++ - 是否可以在不使用汇编的情况下告诉 clang 哪些寄存器用于代码的某些部分

c++ - 如何解决不符合 Visual C++ 标准的问题?

c++ - 运行时函数模板类型推导

c++ - 在 C++ 中,是否可以/如何在输入后、在同一行、在给出用户输入之前显示控制台输出?

c++ - 使用 iostream 处理错误

c++ - 使用 clang 和 g++ 编译此 "simple"程序时出现链接错误

android - .so 文件创建期间的链接器错误。错误 : Function not Implemented