今天看了一下Standard C++有关auto_ptr的介绍,感觉那个结构不清晰,直接看源码
从代码中可以看出
1. auto_ptr可以辅助我们管理内存
2. auto_ptr在‘复制’的时候,管理权会放弃
3. auto_ptr_ref的引入 巧妙解决了右值引用的问题。
对于第3点,详细说明一下
在标准C++中 右值引用时不可以的。比如:
如果有函数 int f(void);
我们采用: int &p =f(void);这样的方式,在标准C++中是不允许的
必须要 const int &p = f(void); //之所以要说是标准C++ 因为在Vc中是支持的。呵呵
从源代码上可以看出 auto_ptr的拷贝构造函数“不是”我们常看见的 auto_ptr(const atuo_ptr<T> &p);
而是设计为 auto_ptr(atuo_ptr<T> p)这样的样式(原因是在这个拷贝构造函数中,对于传入的参数我们必须使其放弃管理权)
在这种设计下:我们就不能写这样的函数 atuo_ptr p( f(void) )
所以引入了auto_ptr_ref这个辅助结构来帮助我们的auto_ptr可以执行这样的函数 atuo_ptr p( f(void));
具体步骤为:
===============================================================================
auto_ptr<int> p(auto_ptr<int>(new int(0)))
便可以成功,过程如下:
1. 构造临时对象 auto_ptr<int>(new int(0))
2. 想将临时对象通过拷贝构造函数传给p,却发现没有合适的拷贝构造函数,因为只有auto_ptr(auto_ptr& rhs)这个不能用,又没有auto_ptr(const auto_ptr& rhs) (因为用了在所有权转移中会出错),呵呵!
3. 编译器只能曲线救国,看看类型转换后能不能传递。
4. 由于我们定义了 operator auto_ptr_ref() 所以编译器自然就可以试一下转为 auto_ptr_ref类型。
5. 编译器猛然间发现,我们定义了 auto_ptr(auto_ptr_ref rhs):ap(rhs.p){} 的构造函数,可以传递。
6. 顺利构造p,任务完成。
上面引用 http://blog.csdn.net/benny5609/archive/2008/06/06/2516822.aspx 的描述。
===============================================================================