在完美转发中,std::forward用于转换命名的右值引用t1和t2未命名的右值引用.这样做的目的是什么?inner如果我们离开t1&t2作为左值,那将如何影响被调用的函数?
template <typename T1, typename T2>
void outer(T1&& t1, T2&& t2)
{
inner(std::forward<T1>(t1), std::forward<T2>(t2));
}
Run Code Online (Sandbox Code Playgroud) 据我所知,在C++ 11中,应始终使用通用引用std::forward,但我不确定如果std::forward不使用会出现什么样的问题.
template <T>
void f(T&& x);
{
// What if x is used without std::forward<T>(x) ?
}
Run Code Online (Sandbox Code Playgroud)
你能否举例说明在这种情况下可能出现的问题?
考虑以下代码:
template<class F>
void foo1(F f) { f(); }
template<class F>
void foo2(F const& f) { f(); }
template<class F>
void foo3(F&& f) { f(); }
Run Code Online (Sandbox Code Playgroud)
foo我应该使用哪个版本?foo1这是我在"野外"看到的最多,但我担心它可能会引入我不想要的副本.我有一个很复杂的自定义仿函数,所以我想避免这种情况.目前我倾向于foo3(因为foo2不允许变异的算子),但我不确定其含义.
我的目标是C++ 11.