Boost logo

Boost :

From: Howard Hinnant (hinnant_at_[hidden])
Date: 2001-01-06 11:09:12


Howard Hinnant wrote on 1/6/2001 11:02 AM

>David Abrahams wrote on 1/6/2001 10:38 AM
>
>>I think this is a mistake. Conversions to/from auto_ptr_ref<X> allow us to
>>convert between auto_ptr<X> to auto_ptr<X[]>, which will call the wrong
>>version of delete. I think you need to use a new class, e.g.
>>auto_ptr_array_ref, to do this. And since you aren't depending on details of
>>auto_ptr_ref any more, it should work portably.
>
>Excellent eye Dave!
>
>Unfortunately your suggested fix does not solve the problem. Even with
>auto_ptr_array_ref the member template copy constructor and member
>template conversion operators of the primary template allow conversions
>both ways:
>
> template<class Y> auto_ptr(auto_ptr<Y>& a) throw();
> template<class Y> operator auto_ptr<Y>() throw();
>
>However, adding the following to the primary template's private section
>seems to do the trick:
>
>template<class X>
>class auto_ptr
>{
> ...
>private:
> X* ptr_;
>
> template<class Y> auto_ptr(auto_ptr<Y[]>&) throw();
> template<class Y> operator auto_ptr<Y[]>() throw();
>};
>
>This even works with the specialization using auto_ptr_ref as originally
>proposed. I'm not positive I fully understand the reasons.
>
>There may be other/better ways of shorting out this unwanted conversion.
>
>This issue definitely needs closer study.

Oops, I take it back. Both approaches seem to be needed
(auto_ptr_array_ref and the private declarations).

-Howard


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk