为什么非const ptr不能隐式地将ptr转换为const作为模板中的参数

时间:2013-12-02 14:25:50

标签: c++

我只是尝试实现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指针时,会发生隐式转换。下面的代码很好。这让我很困惑。

2 个答案:

答案 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对象的指针,那么您只是承诺尽管对象可以修改,你不会修改它。变异不是强制性的,所以这很好。