协程和可变参数

6
cpp reference page中指定的协同程序的第一个限制是,协程不能使用可变参数。但是当我尝试使用一个在其参数列表中接受可变参数的协程时,例如:
template<typename ...Args>
ReturnObject coro_with_variadic_argument1(Args ...args){
    std::cout << "size of variadic args: " << sizeof...(args) << "\n";
    co_await std::suspend_never{};
}

在GCC-11和Clang-14中它能够良好运行,只有MSVC-19会给出一些警告,但这些警告似乎与coroutines和varidaic参数无关,并在警告之后打印输出。请参见compiler explorer上的代码。那么,cppreference页面上的语句:“协程不能使用可变参数…”到底是什么意思?

是否有一个例子,其中创建具有可变参数的C++协程是非法的?


2
你展示的是一个模板参数包,这是可以的。不能使用的是可变参数 https://godbolt.org/z/eqhjahGen 点击cppreference页面上的链接,了解可变参数的含义 https://en.cppreference.com/w/cpp/language/variadic_arguments - cigien
@cigien 感谢您指出这一点。我现在明白了区别。 - ggulgulia
1
提名重新开放,因为我认为在这里关于为什么允许模板包但不允许可变参数还有更有趣的细节可以添加到答案中。 - Silvio Mayolo
1个回答

9
正如 cigien评论中提到的,我将可变参数与模板参数包混淆了。
因此,以下内容将是非法的协程:
ReturnObject coro_with_variadic_argument1(...) // <-- note variadic arg here 
{
    co_await std::suspend_never{}; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接