我只是尝试实现std :: auto_ptr,我的声明如下。
template<typename T>
class auto_ptr_imp
{
public:
explicit auto_ptr_imp<T>(T const* rhs=NULL);
auto_ptr_imp(auto_ptr_imp<T>&);
auto_ptr_imp& operator =(auto_ptr_imp<T>&);
T& operator*();
T* operator->();
private:
T* m_ptr;
};
template<typename T>
auto_ptr_imp<T>::auto_ptr_imp(T * ptr)
{
this->m_ptr=ptr;
}
//in main function call this
auto_ptr_imp<ClassA>ptr(new ClassA(2)); //compile error
int*p=NULL;
int const* pp=p;//no error
然后错误:“=”:无法将“const ClassA *”强制转换为“ClassA *”。
但是我记得当指向一个指向const的指针的非const指针时,会发生隐式转换。下面的代码很好。这让我很困惑。
答案 0 :(得分:1)
我假设您打算声明:
explicit auto_ptr_imp<T>(T const* rhs=NULL);
这样:
explicit auto_ptr_imp<T>(T * const rhs=NULL);
请记住const T*
和T const*
是相同的 - 指向const T
的非常量指针。只有T * const
是指向非const T
的const指针。
答案 1 :(得分:0)
如果可以将“指向const
对象的指针”类型的值赋给指向非const
对象的指针,则可以通过该指针修改const
对象。当然这是错误的。
但是,如果您将指向非const
对象的指针指向指向const
对象的指针,那么您只是承诺尽管对象可以修改,你不会修改它。变异不是强制性的,所以这很好。