bmk@m2.csc.ti.com (Brian M Kennedy) (06/19/91)
>=daniel=> >This means that the following program is legal in C++ and >ANSI C, and has different meanings in the two languages. >Am I correct in thinking that a design goal of Bjarne's was >to avoid the possibility of such a program? >Is that design goal sufficiently important to motivate x3j16 >to change the type of 'c' to int? >[... program exercising sizeof('a') ...] Yes and no. Yes, being consistent with C would have been a strong enough reason for Bjarne to have made the type of 'c' be int in the first place, EXCEPT that there is a stronger reason to have 'c' be char in C++: overloading. If I write: cout << 'A'; cout << 65; I want overload resolution to choose operator<<(ostream&, char) for the first call and operator<<(ostream&, int) for the second. If 'A' was type int then the first call would print the int value of A rather than the character A. That would be very ugly. This is discussed by E&S (ARM) on p.9, 2.5.2, in the annotations. ======================================= == Brian M. Kennedy <bmk@csc.ti.com> == == Computer Systems Laboratory ======== == Computer Science Center ============ == Texas Instruments ==================
mmk@d62iwa.mitre.org (Morris M. Keesan) (06/21/91)
In article <1991Jun18.210440.16325@csc.ti.com> bmk@m2.csc.ti.com (Brian M Kennedy) writes: > . . . being consistent with C would have been a strong enough reason > for Bjarne to have made the type of 'c' be int in the first place, > EXCEPT that there is a stronger reason to have 'c' be char in C++: > overloading. > > If I write: > > cout << 'A'; > cout << 65; > > I want overload resolution to choose operator<<(ostream&, char) for > the first call and operator<<(ostream&, int) for the second. If 'A' > was type int then the first call would print the int value of A rather > than the character A. That would be very ugly. > > This is discussed by E&S (ARM) on p.9, 2.5.2, in the annotations. The reason for 'a' to be a char is indeed for overload resolution to work, as discussed in the ARM in 2.5.2, but the example given above is not a good example. In fact, in the implementations I'm familiar with (and I haven't used 2.0, so I don't know if it's still true), cout << 'A' prints the int value of A. See "The C++ Programming Languange" by Stroustrup, 1987 edition. On p. 9, 8.2.1, we see class ostream defined with operator<<(char*) and operator<<(int), but no operator<<(char), and two pages later, on page 229, we see ---------------------------------------------------------------------- There are no character valued expressions in C++. In particular, '\n' is an integer (with the value 10 when the ASCII character set is used), so that cout << "x = " << x << '\n'; writes the number 10 and not the expected newline. ---------------------------------------------------------------------- The ARM does not address this issue, leaving ostreams, cout, and overloaded << operators as a library issue rather than a language issue. What do 2.0 implementations do with this? Is this an incompatibility that will cause problems for C++ 1.2 programs passing "char"s to << when the programs are compiled with C++ 2.0? ------------------------------------------------ Morris M. Keesan mmk@d62iwa.mitre.org