Re: A problem with non const iterators that behave like const ones
On 2007-08-24 11:41:02 -0400, Bart van Ingen Schenau
<bart@ingen.ddns.info> said:
Ema wrote:
Hello.
I'm facing a strange issue. I'm using composed types (like std::map(s)
of std::set(s)) and everything works fine, but when I try to access
structures stored in these variables to modify them, the gcc
compiler(s) (from gcc 3.2 to gcc 4.x) refuse to compile it while msvc
does.
Here's an easy snippet:
<snip - code & errors>
--------------------------------------------------------
I really don't understand why the compiler thinks that data member
Foo::Bar::b is in read only structure when I'm using ::iterator and
not ::const_iterator.
Actually, g++ is right and MSVC is wrong.
Actually, they're both right.
The elements of a std::set<> are not modifiable, because that could
cause a violation of the invariants of the std::set<> class.
The elements of std::set<> are always stored in increasing order
(according to the comparator). This is a class invariant of std::set<>.
As std::set<> does not know which parts of the contained objects affect
the ordering, the conservative assumption is that all parts do so.
For this reason, even the regular iterators of std::set<> do not allow
modification of the item they refer to.
That's the explanation for the change to set's iterator requirements
made for C++0x. In C++ 2003 there is no such requirement.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]