Re: const element type in standard library containers
* subramanian100in@yahoo.com, India:
Program 1:
---------------
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<const int> c2;
return EXIT_SUCCESS;
}
This program gives compilation error for the vector instantiation.
Elements of a vector must be copy constructible and assignable.
You're lucky that the implementation is robust enough to catch the error.
Now consider the following program 2:
-------------------------------------------------------
#include <cstdlib>
#include <iostream>
#include <set>
#include <utility>
using namespace std;
int main()
{
typedef pair<const int, const int> p_type;
multiset<p_type> c1;
c1.insert(make_pair(0, 2));
return EXIT_SUCCESS;
}
But this second program also has 'const int' as part of the element
type; but it compiles fine.
For a multiset the key type is also the value type.
Formally this would mean that keys of a multiset must be copy constructible and
assignable, but since that is meaningless I guess that this is a specification
error in the standard (lumping multiset in with containers with value elements).
As further indication of that, consider that a bitset doesn't have a value type,
and is a container, yet it is general requirement of containers that a container
type has a value_type and that that value_type is copy constructible and
assignable, and this requirement is not explitly waived for bitset.
Short version: the standard moves in mysterious and not always consistent ways.
Even shorter: all's not Perfect. :-)
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?