...(省略号)应该放在 C++ 参数包扩展中的哪里?括号里面还是外面?

问题描述 投票:0回答:1

我是 C++ 参数包扩展的新手,长期以来我对 ...(省略号)的位置感到困惑。 例如,

template <typename... Args> 
void func(Args&&... args) {
    // ...
    std::forward<Args>(args)...;
    // ...
}

为什么没有

std::forward<Args>(args...)
?我应该遵循什么规则?谢谢您的回答!

c++ c++11 c++17
1个回答
0
投票

从语法上来说,

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
不是可变参数函数模板。

© www.soinside.com 2019 - 2024. All rights reserved.