【发布时间】:2020-02-26 12:17:02
【问题描述】:
我一直在使用 C++20 协程,并尝试将我的一些代码库转移到使用它们。不过,我遇到了一个问题,因为似乎无法复制新的协程。 generator 对象已删除复制构造函数和复制赋值运算符,而我所研究的一切似乎都没有办法。
这个可以吗?
作为参考,我编写了一个小测试程序,尝试复制 C++20 协程失败,并成功尝试使用 boost::asio::coroutine 做同样的事情。这是使用 Visual Studio 2019 版本 16.3.7
#include <sdkddkver.h>
#include <string>
#include <algorithm>
#include <iterator>
#include <experimental\resumable>
#include <experimental\generator>
#include <cassert>
#include <boost\asio\yield.hpp>
namespace std_coroutines {
auto letters() {
for (auto c = 'a'; ; ++c)
co_yield c;
}
void run() {
auto gen = letters();
std::string s1, s2;
std::copy_n(gen.begin(), 3, std::back_inserter(s1)); // append "abc" to s1
//auto gen_copy = gen; // doesn't compile
std::copy_n(gen.begin(), 3, std::back_inserter(s1)); // append "def" to s1
//std::copy_n(gen_copy.begin(), 3, std::back_inserter(s2)); // append "def" to s2
assert(s1 == "abcdef");
assert(s2 == "def"); // fails
}
};// namespace std_coroutines
namespace boost_asio_coroutines {
struct letters : boost::asio::coroutine {
char c = 'a';
char operator()() {
reenter(this) for (;; ++c)
{
yield return c;
}
}
};
void run() {
auto gen = letters();
std::string s1, s2;
std::generate_n(std::back_inserter(s1), 3, std::ref(gen)); // append "abc" to s1
auto gen_copy = gen;
std::generate_n(std::back_inserter(s1), 3, std::ref(gen)); // append "def" to s1
std::generate_n(std::back_inserter(s2), 3, std::ref(gen_copy)); // append "def" to s2
assert(s1 == "abcdef");
assert(s2 == "def");
}
} // namespace boost_asio_coroutines
int main() {
boost_asio_coroutines::run();
std_coroutines::run();
}
【问题讨论】:
-
我不知道 boost 协程,但是
std::generator拥有底层协程的所有权;因此它只能被移动(因为无法复制底层协程)。 -
所以..不是吗?没有办法复制c++20协程?
-
@KaenbyouRin 你肯定可以复制boost协程,我写的示例代码演示了它
-
请不要在
#include路径中使用反斜杠。正斜杠在任何地方都很好用,所以就默认使用那些。