a.l*_*ram 2 c++ templates rvalue-reference c++11
是否有一种很好的方法可以将函数的参数转发f给g类似情境中的函数
template<typename... T>
void g(T && ... x);
template<typename... T>
void f(T && ... x)
{
g(x..., x...);
}
Run Code Online (Sandbox Code Playgroud)
在下一个代码中x可以移动两次
template<typename... T>
void f(T && ... x)
{
g(std::forward<T>(x)..., std::forward<T>(x)...);
}
Run Code Online (Sandbox Code Playgroud)
在下一个代码std::forward<T>(x)...之前可以进行评估x...
template<typename... T>
void f(T && ... x)
{
g(x..., std::forward<T>(x)...);
}
Run Code Online (Sandbox Code Playgroud)
std::forward不移动的东西 - 它创建了一个参考,上面写着"可以离开我".实际移动发生在内部g,而不是在f哪里std::forward或被std::move称为.
问题move只是这里的问题之一.还有一个问题就是在两个位置将相同的对象作为参考传递两次,这通常被认为是非常粗鲁的!
我们可以通过创建临时对象f并通过引用传递它来解决这个问题,但这会导致严重的问题:引用通常用于从函数返回值,并且我们使用相同的变量两次 - 我们无法返回两个结果.
所以答案是"不要那样做",因为它通常不安全.您必须知道两者的语义g并f弄清楚正确的事情是什么,而简单的转发类型接口将无法反映所需的知识深度.
如果你对什么g和f应该做什么有深刻的语义理解,那么情况会发生变化.