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
Consider:
inline auto lambda = []{}; // same in different translation units or not?
This can be observed, for example, through the following variable template:
template<class T> int v;
Is &v<decltype(lambda)> the same address in every translation unit?
Possible resolution:
Change in 6.3 [basic.def.odr] paragraph 14 as follows:
For any definable item D with definitions in multiple translation units,the program is ill-formed; a diagnostic is required only if the definable item is attached to a named module and a prior definition is reachable at the point where a later definition occurs. Given such an item, for all definitions of D, or, if D is an unnamed enumeration, for all definitions of D that are reachable at any given program point, the following requirements shall be satisfied, where the definition of a closure type is considered to consist of the sequence of tokens of the corresponding lambda-expression.
- if D is a non-inline non-templated function or variable, or
- if the definitions in different translation units do not satisfy the following requirements,
- ...
- Each such definition shall consist of the same sequence of tokens
, where the definition of a closure type is considered to consist of the sequence of tokens of the corresponding lambda-expression.- ...
Add another example after example 6, immediately before 6.3 [basic.def.odr] paragraph 18:
[ Example:inline decltype([]{}) v1; inline auto v2 = []{};If the definition of v1 appears in multiple translation units, the program is ill-formed, no diagnostic required, because each definition declares v1 to have a different type. If the definition of v2 appears in multiple translation units, the behavior of the program is as if there is only one definition, and only a definition can supply an initializer; therefore the behavior is as if there is only one initializer. Therefore, v2 has the same type in every translation unit. -- end example]
If, at any point in the program, there is more than one reachable unnamed enumeration definition in the same scope...