对于函数模板
template<class T>
T* Test(T&& arg)
{
return new T(std::forward<T>(arg));
}
当传入实参为X类型左值时,T为X&,最后的类型为X&。当实参为X类型右值时,T为X,最后的类型为X&&。
x为左值时:
X x;
Test(x);
T为X&,实例化后
X& && std::forward(remove_reference<X&>::type& a) noexcept
{
return static_cast<X& &&>(a);
}
X* Test(X& && arg)
{
return new X(std::forward<X&>(arg));
}
// 塌陷后
X& std::forward(X& a)
{
return static_cast<X&>(a);
}
X* Test(X& arg)
{
return new X(std::forward<X&>(arg));
}
x为右值时:
X foo();
Test(foo());
T为X,实例化后
X&& std::forward(remove_reference<X>::type& a) noexcept
{
return static_cast<X&&>(a);
}
X* Test(X&& arg)
{
return new X(std::forward<X>(arg));
}
// 塌陷后
X&& std::forward(X& a)
{
return static_cast<X&&>(a);
}
X* Test(X&& arg)
{
return new X(std::forward<X>(arg));
}
可以看到最终实参总是被推导为和传入时相同的类型引用。
至此,我们讨论了变长参数模板,讨论了右值引用和函数模板的完美转发,完整的解释了MemNew对任意多个参数的构造函数的参数传递过程。利用变长参数函数模板,右值引用和std::forward ,可以完成参数的完美转发。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用C++能有所帮助,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。
注:相关教程知识阅读请移步到C++教程频道。










