我只是在玩弄理解智能指针并尝试制作我的指针,但我遇到了一种我不完全理解的情况。这是代码:
#include <iostream>
template <class T>
class Holder
{
private:
T * obj;
public:
Holder(T * tt) : obj(tt)
{
std::cout << "ctor : " << tt->dummy << std::endl;
}
T * operator -> ()
{
return obj;
}
operator bool()
{
return obj;
}
T * const get() const
{
return obj;
}
void reset() {swap(0);}
void swap(T * other)
{
obj = other;
}
Holder & operator = (const Holder& holder)
{
obj = holder.get();
return *this;
}
Holder(const Holder & holder) : obj(holder.get()) {}
};
class A
{
public:
int dummy;
A(int a) : dummy(a) {}
};
int main ()
{
A * a = new A(1);
Holder<A> holder(a);
A * b = new A(2);
holder = b;
std::cout << holder->dummy << std::endl;
return 0;
}
代码编译并上线holder = b;
的构造函数Holder
类被称为。我以为编译器会报错。它不是赋值运算符,但为什么它调用构造函数?
holder = b
尝试分配自b
to Holder
. b
属于类型A*
, and holder
属于类型Holder<A>
.
The Holder
模板定义来自同一实例的另一个实例的分配Holder
类型,因此编译器会寻找转换 from A*
to Holder<A>
。它找到构造函数并使用它。
可能只接受一个参数的构造函数可用于隐式转换,unless你用explicit
关键词。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)