c++11完美转发

我通过下面的例子和注释,充分说明了对C++11完美转发的理解。

输出如下:

std::forward的实现:

在我的例子中,forward函数调用显式传递了模板类型:forward<T>(a),通过remove_reference剥离出type为int,然后会进入第一个forward重载函数,这是因为无论func的var是左值引用还是右值引用,传递给forward时都是左值。

remove_reference利用模板类的偏特化,实现对int类型的剥离:

forward函数接下来利用func函数推导的T类型进行&&折叠,并对变量进行类型转换:

如果T是int【func(1)的场景】,那么int &&就是int&&,右值类型得到保持。

如果T是int&&【func(static_cast<int&&>(b))的场景】,那么int&& &&就是int&&,右值引用类型得到保持。

如果T是int&【func(a)的场景】,那么int& &&就是int&,左值类型得到保持。

经过static_cast转换后的__t类型保持了func参数var的原本面貌,对printA的调用提供了强烈的类型暗示。

其他

std::move强制转换类型为右值引用也很容易理解了:

同样利用了万能模板参数接受传参,利用remove_referrence提取基础类型type,并将参数__t强制转换为type&&。

这里除了move自身的万能模板参数利用了折叠原则,在static_cast部分并没有采用折叠,而是直接明确转换为了右值引用type&&,这一点与forward的实现是完全不同的,一定要注意仔细区分。

 

c++11完美转发》上有2条评论

  1. voyager1

    文中出现的概念都讲到解释到了。👍
    虽然从来没真正掌握过c++,然而一直爱着❤️c++❤️。

    回复

发表评论

电子邮件地址不会被公开。