Container requirements have changed from C++03 to C++11. While C++03 had blanket requirements (e.g. copy constructibility and assignability for vector), C++11 defines fine-grained requirements on each container operation (section 23.2).
As a result, you can e.g. store a type that is copy-constructible but not assignable – such as a structure with a const member – in a vector as long as you only perform certain operations that do not require assignment (construction and push_back are such operations; insert is not).
What I’m wondering is: does this mean the standard now allows vector<const T>? I don’t see any reason it shouldn’t – const T, just like a structure with a const member, is a type that is copy constructible but not assignable – but I may have missed something.
(Part of what makes me think I may have missed something, is that gcc trunk crashes and burns if you try to instantiate vector<const T>, but it’s fine with vector<T> where T has a const member).
No, I believe the allocator requirements say that T can be a “non-const, non-reference object type”.
You wouldn’t be able to do much with a vector of constant objects. And a
const vector<T>would be almost the same anyway.Many years later this quick-and-dirty answer still seems to be attracting comments and votes. Not always up. 🙂
So to add some proper references:
For the C++03 standard, which I have on paper, Table 31 in section [lib.allocator.requirements] says:
Not that any type actually worked.
So, the next standard, C++11, says in a close draft in [allocator.requirements] and now Table 27:
which is extremely close to what I originally wrote above from memory. This is also what the question was about.
However, in C++14 (draft N4296) Table 27 now says:
Possibly because a reference perhaps isn’t an object type after all?
And now in C++17 (draft N4659) it is Table 30 that says:
So not only is
construled out, but alsovolatile. Probably old news anyway, and just a clarification.Please also see Howard Hinnant’s first-hand info, currently right below.