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


1882. Reserved names without library use

Section: _N4140_.17.6.4.3.2  [global.names]     Status: CD4     Submitter: Mike Miller     Date: 2014-02-26

[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):

  1. Change 5.11 [lex.name] paragraph 3 as follows:

  2. 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.

  3. Change the footnote in 9.5.1 [dcl.fct.def.general] paragraph 8 as follows:

  4. [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]
  5. Change the example in 12.6 [over.literal] paragraph 8 as follows:

  6.   double operator""_Bq(double);  // OK: does not use the reserved name identifier _Bq (_N4140_.17.6.4.3.2 [global.names] 5.11 [lex.name])
      double operator"" _Bq(double); // uses the reserved name identifier _Bq (_N4140_.17.6.4.3.2 [global.names] 5.11 [lex.name])
    
  7. Delete _N4140_.17.6.4.3.2 [global.names]:

  8. Certain sets of names and function signatures are always reserved to the implementation: