我不明白这段代码是如何工作的。谁能告诉我一点。我非常确定“参数包应该是最后一个参数”
void foo(auto&&...args1, auto&&... args2, auto&&... args3) {
std::cout << "args1:\n", ((std::cout << args1 << " "), ...);
std::cout << "args2:\n", ((std::cout << args2 << " "), ...);
std::cout << "args3:\n", ((std::cout << args3 << " "), ...);
}
int main(int argc, char** argv)
{
foo(1,2,3,4,5,6);
}
Run Code Online (Sandbox Code Playgroud)
如果允许,我如何拆分arg1、args2和args3?
编译器 (g++-11) 假定除 args3 之外的所有参数包均为空,因此输出为
args1:
args2:
args3:
1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
use*_*570 10
该程序格式错误,gcc 和 clang 在接受代码时错误。您还可以通过稍微修改代码来确认这一点,如下所示。对此还有一个旧的gcc 错误。
基本上,在函数模板的情况下(在下面所示的修改后的程序中),允许使用多个模板参数包,只要模板参数包后面的每个模板参数都具有默认值或可以推导即可。T2但是,由于和均未满足这些要求T3(因为它们不能明确地推导并且不能有默认参数),因此该程序是格式错误的。
完全相同的推理适用于您给定的示例,因为foo(在您的原始示例中)是通用函数(又名缩写函数模板)。
对于以下修改后的程序,GCC 和 Clang 显示了相同的错误行为:演示
template<typename... T1, typename... T2, typename... T3>
void foo(T1&&...args1, T2&&... args2, T3&&... args3) {
std::cout << "args1:\n", ((std::cout << args1 << " "), ...);
std::cout << "args2:\n", ((std::cout << args2 << " "), ...);
std::cout << "args3:\n", ((std::cout << args3 << " "), ...);
}
int main(int argc, char** argv)
{
foo(1,2,3,4,5,6); //gcc and clang compiles this while msvc correctly rejects this
}
Run Code Online (Sandbox Code Playgroud)
这是 gcc 错误:
这是 clang 错误:
从temp.param也可以看出同样的情况:
函数模板的模板参数包后面不应跟有另一个模板参数,除非该模板参数可以从函数模板的参数类型列表 ([dcl.fct]) 推导出来或具有默认实参([temp.fct])。扣除])。
Run Code Online (Sandbox Code Playgroud)// U can be neither deduced from the parameter-type-list nor specified template<class... T, class... U> void f() { } // error
(强调我的)
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |