【发布时间】:2013-07-15 04:09:46
【问题描述】:
在这样的情况下,有没有一种好方法可以将函数 f 的参数转发给函数 g
template<typename... T>
void g(T && ... x);
template<typename... T>
void f(T && ... x)
{
g(x..., x...);
}
在下一个代码中x 可以移动两次
template<typename... T>
void f(T && ... x)
{
g(std::forward<T>(x)..., std::forward<T>(x)...);
}
在下一个代码中,std::forward<T>(x)... 可以在 x... 之前进行评估
template<typename... T>
void f(T && ... x)
{
g(x..., std::forward<T>(x)...);
}
【问题讨论】:
-
您不能将多个相同的引用传递给另一个函数,至少有一个是右值引用,并且不要期望会发生可怕的事情。通过
const&取参数。 -
如果“g”被内联而不是“yes”。如果 G 是一个模板,那么如果编译器认为这是一个好主意,它将被内联。而且编译器比你更聪明(当涉及到内联时),所以通常最好让它自己做。
-
或者 std::move,如果你想这样做也可以,但是天哪,这是个坏主意。
-
g(x..., x...)到底有什么问题?你真的不能做得比这更好,因为无论如何移动都是一个问题。
标签: c++ templates c++11 rvalue-reference