sdm@cs.brown.edu (Scott Meyers) (02/07/91)
For both ANSI C and as-ANSI-as-we-have C++, are the members of a const struct themselves const? Consider this: struct Foo { char *data; }; char * f(const struct Foo x) { return x.data; } Within function f, x is a const. Is x.data therefore a const? If so, there should be a type mismatch between the expression being returned (const char *) and the function's return type (char *). Yet this example sails through 3 C++ compilers (g++, cfront 2.0, Sun cfront 2.1 beta) and one ANSI C compiler (gcc) without so much as a wimper. The same question can be put this way: is the following legal? const struct foo x; char **p = &(x.data); /* lhs = char **, rhs = const char ** */ If the members of a const structure are themselves supposed to be const, I'd appreciate it if you'd point me to an authoritative reference that says so. For C++, I looked in the ARM, but couldn't find anyplace where it said what should happen. For C, all I've got is the second (ANSI C-based) edition of K&R, but I couldn't find any information in there, either. Thanks, Scott ------------------------------------------------------------------------------- What do you say to a convicted felon in Providence? "Hello, Mr. Mayor."
ark@alice.att.com (Andrew Koenig) (02/08/91)
In article <63928@brunix.UUCP> sdm@cs.brown.edu (Scott Meyers) writes: > struct Foo { > char *data; > }; > char * f(const struct Foo x) > { > return x.data; > } > Within function f, x is a const. Is x.data therefore a const? Yes, in both ANSI C and C++, but that doesn't have the implications you think it does. For example, the ANSI C standard gives the following example in section 3.5.3 (slightly abbreviated here): const struct s { int mem; } cs = { 1 }; int * pi; pi = &cs.mem; /* violates type constraints for = */ > Yet this example > sails through 3 C++ compilers (g++, cfront 2.0, Sun cfront 2.1 beta) and > one ANSI C compiler (gcc) without so much as a wimper. When you say that x is a const Foo, that means that x.data is itself a constant -- but that doesn't say anything about the memory to which x.data points. In other words, the type of x.data is char *const, which is distinct from const char *. In particular, there is no problem assigning a char *const to a char *. -- --Andrew Koenig ark@europa.att.com