|
Boost : |
From: Howard Hinnant (hinnant_at_[hidden])
Date: 2001-01-06 11:02:51
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.
-Howard
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk