http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55963
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-13 22:43:56 UTC --- Looks like PJP's comment was from 2008, so I'm not sure what requirements he means were standardized in 2008. Looking further into it, I see that the Allocator requirements in C++11 say an allocator can only be instantiated with a non-const type, see http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#274 Because vector<const T> instantiates allocator<const T> that makes it definitely ill-formed. So I think I'm going to add a static_assert to std::allocator that rejects const types, so the error is at least clear it's intentional not a bug. To make it work you could write your own thin wrapper around std::allocator that prevents instantiating it with const types, something like: template<typename T> struct allocator : std::allocator<typename std::remove_const<T>::type> { template<typename U> struct rebind { typedef allocator<U> other; }; typedef T value_type; allocator() = default; allocator(const allocator&) = default; template<typename U> allocator(const allocator<U>&) { } }; Then use std::vector<const int, allocator<const int>>.