This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 116a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-12-19
[Moved to DR at the November, 2014 meeting.]
The section of the Standard reserving names that begin with two underscores or an underscore and a capital letter, _N4140_.17.6.4.3.2 [global.names], applies only to “programs that use the facilities of the C++ standard library” (16.4.5.1 [constraints.overview]). However, implementations rely on this restriction for mangling, even when no standard library facilities are used. Should this requirement be moved to the core language section?
(There is a related issue with user-defined literal suffixes, 16.4.5.3.6 [usrlit.suffix]. However, these are already mentioned normatively in the core language section, so it could be argued that the question of library usage does not apply.)
Proposed resolution (October, 2014):
Change 5.11 [lex.name] paragraph 3 as follows:
In addition, some identifiers are reserved for use by C++ implementations
and standard libraries (_N4140_.17.6.4.3.2 [global.names])and shall not be used otherwise; no diagnostic is required.
Each identifier that contains a double understore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.
Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
Change the footnote in 9.5.1 [dcl.fct.def.general] paragraph 8 as follows:
[Footnote: Implementations are permitted to provide additional predefined variables with names that are reserved to the implementation (_N4140_.17.6.4.3.2 [global.names]5.11 [lex.name]). If a predefined variable is not odr-used (6.3 [basic.def.odr]), its string value need not be present in the program image. —end footnote]
Change the example in 12.6 [over.literal] paragraph 8 as follows:
double operator""_Bq(double); // OK: does not use the reservednameidentifier _Bq (_N4140_.17.6.4.3.2 [global.names]5.11 [lex.name]) double operator"" _Bq(double); // uses the reservednameidentifier _Bq (_N4140_.17.6.4.3.2 [global.names]5.11 [lex.name])
Delete _N4140_.17.6.4.3.2 [global.names]:
Certain sets of names and function signatures are always reserved to the implementation:
Each name that contains a double underscore __ or begins with an underscore followed by an uppercase letter (5.12 [lex.key]) is reserved to the implementation for any use.
Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.