CWG Issue 83 (original) (raw)
This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 118e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-11-05
83. Overloading and deprecated conversion of string literal
Section: 12.2.4.3 [over.ics.rank]Status: TC1Submitter: Steve AdamczykDate: 24 Jan 1999
In 12.2.4.3 [over.ics.rank] , we have
S1 and S2 differ only in their qualification conversion and yield similar types T1 and T2(7.3.6 [conv.qual] ), respectively, and the cv-qualification signature of type T1is a proper subset of the cv-qualification signature of type T2, [Example:
int f(const int *);
int f(int *);
int i;
int j = f(&i); // Calls f(int *)
—_end example_] or, if not that, This does not work right with respect to the deprecated conversion from string literal to "char *". Considervoid f(char *); void f(const char *);
f("abc");
The two conversion sequences differ only in their qualification conversions, and the destination types are similar. The cv-qualification signature of "char *", is a proper subset of the cv-qualification signature of "const char *", so f(char *) is chosen, which is wrong. The rule should be like the one for conversion to bool — the deprecated conversion should be worse than another exact match that is not the deprecated conversion.
Proposed resolution (10/00):
Change 12.2.4.3 [over.ics.rank] bullet 3.1 sub-bullet 3 from
S1 and S2 differ only in their qualification conversion and yield similar types T1 and T2(7.3.6 [conv.qual] ), respectively, and the cv-qualification signature of type T1 is a proper subset of the cv-qualification signature of type T2.
to
S1 and S2 differ only in their qualification conversion and yield similar types T1 and T2(7.3.6 [conv.qual] ), respectively, and the cv-qualification signature of type T1 is a proper subset of the cv-qualification signature of type T2, and S1 is not the deprecated string literal array-to-pointer conversion (7.3.3 [conv.array] ).