我有以下代码(来自Koening& Moo Accelerated C ++ 第255页),它定义了一个通用句柄类Handle
。 Handle
用于管理对象的内存。但是,我不太关注代码的一个方面。
template <class T>
class Handle
{
public:
Handle() : p(0) {}
Handle &operator=(const Handle &);
~Handle() { delete p; }
Handle(T *t) : p(t) {}
private:
T *p;
};
template <class T>
Handle<T> &Handle<T>::operator=(const Handle &rhs)
{
if (&rhs != this)
{
delete p;
p = rhs.p ? rhs.p->clone() : 0;
}
return *this;
};
class Base
{
friend class Handle<Base>;
protected:
virtual Base *clone() const { return new Base; }
private:
int a;
};
main()
{
Handle<Base> h;
h = new Base;
return 0;
}
当我们重载=
时,为什么rhs
const Handle
类型的参数Handle<T> &Handle<T>::operator=(const Handle &rhs)
,main
中的分配中的右侧是Base*
类型为h = new Base
((const T &rhs)
)?参数不应该h
来容纳我们分配给const Handle &rhs
的类型吗?
如果我将const T &rhs
替换为*** Error in `./main': double free or corruption (fasttop): 0x000055aca1402c20 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x790cb)[0x7f16c54020cb]
....
,那么程序会编译 - 但我会从
protected $fillable = ['name', ....];
答案 0 :(得分:1)
new Base
通过Handle
构造函数隐式转换为Handle(T *t)
,然后分配给h
。
来自h = new Base
的隐式转换的工作原理如下:
h = Handle<Base>(new Base);
我用一些打印件更新了您的示例以说明这一点:demo。