$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Beman Dawes (bdawes_at_[hidden])
Date: 2001-04-03 16:54:02
 >>  >// C.hpp
 >>  >class Cimpl;
 >>  >class C {
 >>  >public:
 >>  >  ~C();
 >>  >private:
 >>  >  boost::scoped_ptr<Cimpl> impl;
 >>  >};
 >>  >
 >>  >// C.cpp
 >>  >class Cimpl {
 >>  >};
 >>  >
 >>  >C::~C()
 >>  >{
 >>  >}
 >>  >
 >>  >Am I missing something, or are you talking about a different idiom?
 >>
 >> That is the idiom I was talking about.
At 03:03 PM 4/3/2001, David Abrahams wrote:
 >With the code as written, the definition of Cimpl is only needed in 
C.cpp,
 >which nicely shields the Pimpl's users from implementation details. Since
 >scoped_ptr<CImpl>::~scoped_ptr() is only instantiated in c.cpp, there
 >shouldn't be any problem with mentioning sizeof(T) (i.e. sizeof(Cimpl))
 >there.
At 03:13 PM 4/3/2001, Rainer Deyke wrote:
 >Then there shouldn't be a problem.  Declaring '~C' in 'C' and placing the
 >definition for 'C::~C' below the definition for 'Cimpl' causes 'Cimpl' to 
 >be a complete type at the point where 'scoped_ptr<Cimpl>::~scoped_ptr' is
 >called.  'Cimpl' doesn't even need a trivial destructor.
Ah!  The light dawns on Marblehead! I had been misreading C::~C as 
Cimpl::~Cimpl.
This is starting to seem more familiar.  Isn't it a variation of something 
Kevin Atkinson did in his clone_ptr? (Apologies if I've misremembered his 
name.)
It would apply to other smart pointers, too, wouldn't it? shared_ptr, 
auto_ptr, etc?
The downside is that it will break some existing code, although the fix is 
trivial.  But it does increase safety, so is worth doing.  Where does that 
leave std::auto_ptr<>?  Odd man out, as usual, I guess.
--Beman