
Hi, as sparent@adobe.com pointed out in <http://svn.boost.org/trac/boost/ticket/979>, 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. Consider: 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_ { protected: noncopyable_() {} ~noncopyable_() {} private: noncopyable_( const noncopyable_& ); const noncopyable_& operator=( const noncopyable_& ); }; typedef noncopyable_<void> noncopyable; } using namespace noncopyable_impl; } Regards, Daniel