Boost logo

Boost :

From: Gmane (d.frey_at_[hidden])
Date: 2007-05-31 14:09:37


as sparent_at_[hidden] pointed out in
<>, the EBO is not possible in
some cases. I fixed the operators library, but now I wonder if we should
fix boost::noncopyable as well.


class A : boost::noncopyable {};
class B : boost::noncopyable { A a; };

now sizeof(B)==2 instead of the expected 1. To fix it, we have to change
the interface (or at least allow an alternative interface). Example with
   the interface I'd like to suggest:

class A : boost::noncopyable_<A> {};
class B : boost::noncopyable_<B> { A a; };

now sizeof(B)==1, as expected.

The crucial point of such a change is IMHO the interface. Breaking
noncopyable is bad, so I'd like to add noncopyable_<T> and make
noncopyable a typedef to noncopyable_<void>. This should provide
backwards compatibility and provides users with a better, but less brief
alternative in case they need the additional EBO opportunity. Comments?

Since it's so damn short, here's the suggested implementation:

namespace boost
  namespace noncopyable_impl // prevent unintended ADL
    template< typename > class noncopyable_
      noncopyable_() {}
      ~noncopyable_() {}
      noncopyable_( const noncopyable_& );
      const noncopyable_& operator=( const noncopyable_& );
    typedef noncopyable_<void> noncopyable;

  using namespace noncopyable_impl;

Regards, Daniel

Boost list run by bdawes at, gregod at, cpdaniel at, john at