Dra*_*son 3 c++ templates variadic-functions variadic-templates perfect-forwarding
在C++中,似乎参数通常可以...直接在参数包名称之后扩展。例如,
template <class... Tys>
void function(Tys... params) {
function(params...);
}
Run Code Online (Sandbox Code Playgroud)
然而,当使用 时std::forward,...看起来似乎在参数包名称后面。例如,
template <class... Tys>
void function(Tys... params) {
function(std::forward<Tys>(params)...); // The '...' is outside the parenthesis of 'params'
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么会有差异?为什么下面的代码不正确?
template<class... Tys>
void function(Tys... params) {
function(std::forward<Tys>(params...));
}
Run Code Online (Sandbox Code Playgroud)
参数包在什么时候展开?我可能不完全理解它是如何std::forward工作的或者它如何完美地转发论点。
我很感激任何答案!
适用...于其左侧的事物。
function(params...)
扩展到
function(param1, param2, ..., paramN)。
function(std::forward<Tys>(params)...)
扩展到
function(std::forward<Tys1>(param1), std::forward<Tys2>(param2), ..., std::forward<TysN>(paramN))
function(std::forward<Tys>(params...))
扩展到
function(std::forward<Tys>(param1, param2, ..., paramN))