假设shared_ptr的模板参数为T,它的一个构造函数为:
template< class Y >
explicit shared_ptr( Y* ptr );
其中T可以等于Y,也可以不等于Y。
那么对于它的拷贝构造函数:
shared_ptr( const shared_ptr& r ) noexcept;
和
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
当T等于Y时就是
shared_ptr( const shared_ptr& r ) noexcept;
当T不等于Y时就是
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
那么我的疑问是,既然用指针构造时T可以等于Y,也可以不等于Y,那么
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
也应该包含了这两种情况,为何会多此一举定义一个
shared_ptr( const shared_ptr& r ) noexcept;
呢?
原来模板拷贝构造函数不属于构造函数,就算我们只定义了
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
编译器也会默认合成一个
shared_ptr( const shared_ptr& r ) noexcept;
所以不管定没定义模板拷贝构造函数,
shared_ptr( const shared_ptr& r ) noexcept;
总是存在的。