C++中的变长参数深入理解

2020-01-06 15:53:16刘景俊

对于函数模板


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++教程频道。