
2010/10/15 Gerardo Hernández <g.hernandez@indizen.com>:
My point was to allow ptr containers of <const T> to work, maintaining const-correctness. I believe that requires different underlying container types and not only one as you suggest. So in this code snippet:
boost::ptr_vector<const int> v;
v.push_back(new int); v[0] = 3;
the assignment shall produce a compiler error as v[0] would be const, to maintain const-correctness.
That will still work with using internal containers that are always void const *. ptr_vector<T>'s operator[] would become something like this: T &operator[](size_type i) { return *const_cast<T*>(static_cast<T const *>(internal_container[i])); } That way if T is int const, it's returning an int const& -- and the const_cast is a NOP -- which will prevent v[0] = 3; as desired, but if T is non-const int, then it's returning an int& -- and the const_cast is a type conversion from int const* to int* that's legal because the invariant of the pointer container means that the pointer was of that type on insert, as inserters like push_back don't accept int const* in ptr_vector<int>, just like how we know that the static_cast is legal because of the invariant. Was that clearer? ~ Scott