一、前置知识
二、为什么需要std::forward?
如果一个函数有左值引用和右值引用两个重载版本,右值将与右值引用版本绑定;左值将于左值引用版本绑定。但有时我们可能希望能通过左值调用函数对应的右值引用版本,How?
举一个现实的例子:有一个类型A,它有一个需要动态分配的数据成员i_ptr,并支持拷贝构造和移动构造。然后,在main函数中传给wrapper一个临时变量(右值),wrapper中利用该临时变量构造a2。
#include <cstddef>
#include <iostream>
class A {
public:
A(int i)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
i_ptr = new int(i);
std::cout << "allocate memory addr: " << i_ptr << std::endl;
}
~A()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
if (i_ptr) {
delete i_ptr;
std::cout << "deallocate memory addr: " << i_ptr << std::endl;
i_ptr = nullptr;
}
}
A(const A &obj)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
i_ptr = new int(*obj.i_ptr);
std::cout << "allocate memory addr: " << i_ptr << std::endl;
}
A(A &&obj)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
i_ptr = obj.i_ptr;
obj.i_ptr = nullptr;
}
private:
int *i_ptr = nullptr;
};
void wrapper(A &&a)
{
std::cout << __PRETTY_FUNCTION__ << " BEGIN" << std::endl