我是 C++ 参数包扩展的新手,长期以来我对 ...(省略号)的位置感到困惑。 例如,
template <typename... Args>
void func(Args&&... args) {
// ...
std::forward<Args>(args)...;
// ...
}
为什么没有
std::forward<Args>(args...)
?我应该遵循什么规则?谢谢您的回答!
从语法上来说,
std::forward<Args>(args)...;
没有意义。
您只能在括号或大括号内使用包扩展。
如果你要调用一个函数,比如
foo
,那么你会写:
foo(std::forward<Args>(args)...)
这将是一个后缀表达式
foo(/* ... */)
,其中包含一个表达式列表,它是一个初始化器列表,带有单个初始化器子句std::forward<Args>(args)
和一个...
。
换句话说,
...
不是表达式的一部分;它是表达式列表的一部分。
因此, ...
是“最外层”的东西,因为它的优先级低于任何表达式。
*args...
和 args()...
会将 *
和 ()
应用于 args
中的每个参数。
std::forward<Args>(args...)
是错误的,因为这里的...
适用于调用std::forward
时参数的initializer-list,但
std::forward
不是可变参数函数模板。