Section: 17.14.7 [support.c.headers.other] Status: New Submitter: Alex Mills Opened: 2023-02-09 Last modified: 2023-03-22 22:36:03 UTC
View other active issues in [support.c.headers.other].
View all other issues in [support.c.headers.other].
View all issues with New status.
In 17.14.7 [support.c.headers.other], it states that the <name.h> headers behave "as if each name placed in the standard library namespace by the corresponding header is placed within the global namespace scope". There are exceptions for several different definitions in the headers, but it's left ambiguous as to whether their inclusion in the <name.h> headers is required or unspecified.While it is clear that, for example, ::byte is prohibited, it isn't clear whether std::byte is required to be included at all (this applies to the other listed exceptions as well). Though example 1 makes it appear that their inclusion requirements are meant to be left unspecified, paragraph 1 does not provide clarification. Adding specific wording will ensure this will not be misinterpreted in the future. To do this, we should append a sentence to [support.c.headers.other] p1:
Whether the listed exceptions are included in their corresponding <name.h> headers under the standard library namespace is unspecified.
[2023-03-22; Reflector poll]
Set priority to 4 after reflector poll.
"The new wording is confusingly inconsistent with the existing wording
in that paragraph. Would prefer '... Whether the listed exceptions are declared
in the namespace std by their corresponding
headers is unspecified.'."
This wording is relative to N4928.
Modify 17.14.7 [support.c.headers.other] as indicated:
-1- Every C header other than <complex.h> (17.14.2 [complex.h.syn]), <iso646.h> (17.14.3 [iso646.h.syn]), <stdalign.h> (17.14.4 [stdalign.h.syn]), <stdatomic.h> (33.5.12 [stdatomic.h.syn]), <stdbool.h> (17.14.5 [stdbool.h.syn]), and <tgmath.h> (17.14.6 [tgmath.h.syn]), each of which has a name of the form <name.h>, behaves as if each name placed in the standard library namespace by the corresponding <cname> header is placed within the global namespace scope, except for the functions described in 28.7.6 [sf.cmath], the std::lerp function overloads (28.7.4 [c.math.lerp]), the declaration of std::byte (17.2.1 [cstddef.syn]), and the functions and function templates described in 17.2.5 [support.types.byteops]. It is unspecified whether these names are first declared or defined within namespace scope (6.4.6 [basic.scope.namespace]) of the namespace std and are then injected into the global namespace scope by explicit using-declarations (9.9 [namespace.udecl]).