http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55043
--- Comment #15 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-10-24 15:40:28 UTC --- (In reply to comment #14) > I think it is implementable (I have done something similar to ensure that my > optional<T> realizes the same effect), but the costs are not small: > > 1) It will prevent the incomplete type support Ouch... but not required by the standard. > 2) The implementation changes are not small (my guess) Apart from the changes to allocator_traits and defining CopyInsertable etc. (which I think isn't so hard, I can do that tonight) IIUC it would require changing every container so that e.g. vector<T,A>::vector(const vector&) becomes template<typename U> vector<T,A>::vector(const vector<U,A>&) with constraints is_same<T,U> and CopyInsertable<A,T>, because we can't constrain that constructor if it's not a template Is that even allowed under the as-if rule? Do we really want to go there? Is there some other way to make examples like this compile? #include <vector> struct M { M() = default; M(M&&) = default; M& operator=(M&&) = default; }; typedef std::vector<M> S; static_assert( !std::is_copy_constructible<S>::value, "not CopyConstructible" );