Armin Rigo wrote: > Alas, this doesn't make gcc happy either. (I'm trying gcc 3.4.4.) In > theory, it prevents the const-bypassing trick showed by Martin, but > apparently the C standard (or gcc) is not smart enough to realize that.
It appears to be language-defined. Looking at the assignment char **a; const char* const* b; b = a; then, in C++, 4.4p4 [conv.qual] has a rather longish formula to decide that the assignment is well-formed. In essence, it goes like this: - the pointers are "similar": they have the same levels of indirection, and the same underlying type. - In all places where the type of a has const/volatile qualification, the type of b also has these qualifications (i.e. none in the example) - Starting from the first point where the qualifications differ (from left to right), all later levels also have const. I'm unsure about C; I think the rule comes from 6.3.2.3p2: [#2] For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type; the values stored in the original and converted pointers shall compare equal. So it is possible to convert a non-const pointer to a const pointer, but only if the the target types are the same. In the example, they are not: the target type of a is char*, the target of b is const char*. Regards, Martin _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com