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