From Jason Turner

[basic.lookup.argdep]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmprmjteuac/{from.md → to.md} +23 -15
tmp/tmprmjteuac/{from.md → to.md} RENAMED
@@ -8,11 +8,11 @@ name in the *unqualified-id* does not find any
8
  - function declaration inhabiting a block scope, or
9
  - declaration not of a function or function template
10
 
11
  then lookup for the name also includes the result of
12
  *argument-dependent lookup* in a set of associated namespaces that
13
- depends on the types of the arguments (and for template template
14
  arguments, the namespace of the template argument), as specified below.
15
 
16
  [*Example 1*:
17
 
18
  ``` cpp
@@ -74,26 +74,34 @@ lookup does not apply and the friend function `f` is not found.
74
 
75
  — *end note*]
76
 
77
  For each argument type `T` in the function call, there is a set of zero
78
  or more *associated entities* to be considered. The set of entities is
79
- determined entirely by the types of the function arguments (and any
80
  template template arguments). Any *typedef-name*s and
81
  *using-declaration*s used to specify the types do not contribute to this
82
  set. The set of entities is determined in the following way:
83
 
84
- - If `T` is a fundamental type, its associated set of entities is empty.
 
 
 
 
 
 
 
85
  - If `T` is a class type (including unions), its associated entities
86
- are: the class itself; the class of which it is a member, if any; and
87
- its direct and indirect base classes. Furthermore, if `T` is a class
88
- template specialization, its associated entities also include: the
89
- entities associated with the types of the template arguments provided
90
- for template type parameters; the templates used as template template
91
- arguments; and the classes of which any member templates used as
92
- template template arguments are members. \[*Note 2*: Non-type template
93
- arguments do not contribute to the set of associated
94
- entities. *end note*]
 
95
  - If `T` is an enumeration type, its associated entities are `T` and, if
96
  it is a class member, the member’s class.
97
  - If `T` is a pointer to `U` or an array of `U`, its associated entities
98
  are those associated with `U`.
99
  - If `T` is a function type, its associated entities are those
@@ -109,12 +117,12 @@ set. The set of entities is determined in the following way:
109
  In addition, if the argument is an overload set or the address of such a
110
  set, its associated entities are the union of those associated with each
111
  of the members of the set, i.e., the entities associated with its
112
  parameter types and return type. Additionally, if the aforementioned
113
  overload set is named with a *template-id*, its associated entities also
114
- include its template *template-argument*s and those associated with its
115
- type *template-argument*s.
116
 
117
  The *associated namespaces* for a call are the innermost enclosing
118
  non-inline namespaces for its associated entities as well as every
119
  element of the inline namespace set [[namespace.def]] of those
120
  namespaces. Argument-dependent lookup finds all declarations of
@@ -183,11 +191,11 @@ void test() {
183
  }
184
  ```
185
 
186
  — *end example*]
187
 
188
- [*Note 3*: The associated namespace can include namespaces already
189
  considered by ordinary unqualified lookup. — *end note*]
190
 
191
  [*Example 3*:
192
 
193
  ``` cpp
 
8
  - function declaration inhabiting a block scope, or
9
  - declaration not of a function or function template
10
 
11
  then lookup for the name also includes the result of
12
  *argument-dependent lookup* in a set of associated namespaces that
13
+ depends on the types of the arguments (and for type template template
14
  arguments, the namespace of the template argument), as specified below.
15
 
16
  [*Example 1*:
17
 
18
  ``` cpp
 
74
 
75
  — *end note*]
76
 
77
  For each argument type `T` in the function call, there is a set of zero
78
  or more *associated entities* to be considered. The set of entities is
79
+ determined entirely by the types of the function arguments (and any type
80
  template template arguments). Any *typedef-name*s and
81
  *using-declaration*s used to specify the types do not contribute to this
82
  set. The set of entities is determined in the following way:
83
 
84
+ - If `T` is `std::meta::info` [[meta.syn]], its associated set of
85
+ entities is the singleton containing the enumeration type
86
+ `std::meta::operators` [[meta.reflection.operators]]. \[*Note 2*: The
87
+ `std::meta::info` type is a type alias, so an explicit rule is needed
88
+ to associate calls whose arguments are reflections with the namespace
89
+ `std::meta`. — *end note*]
90
+ - If `T` is any other fundamental type, its associated set of entities
91
+ is empty.
92
  - If `T` is a class type (including unions), its associated entities
93
+ are: the class itself; the class of which it is a member, if any; and,
94
+ if it is a complete type, its direct and indirect base classes.
95
+ Furthermore, if `T` is a class template specialization, its associated
96
+ entities also include: the entities associated with the types of the
97
+ template arguments provided for template type parameters; the
98
+ templates used as type template template arguments; and the classes of
99
+ which any member templates used as type template template arguments
100
+ are members. \[*Note 3*: Constant template arguments, variable
101
+ template template arguments, and concept template arguments do not
102
+ contribute to the set of associated entities. — *end note*]
103
  - If `T` is an enumeration type, its associated entities are `T` and, if
104
  it is a class member, the member’s class.
105
  - If `T` is a pointer to `U` or an array of `U`, its associated entities
106
  are those associated with `U`.
107
  - If `T` is a function type, its associated entities are those
 
117
  In addition, if the argument is an overload set or the address of such a
118
  set, its associated entities are the union of those associated with each
119
  of the members of the set, i.e., the entities associated with its
120
  parameter types and return type. Additionally, if the aforementioned
121
  overload set is named with a *template-id*, its associated entities also
122
+ include its template template arguments and those associated with its
123
+ type template arguments.
124
 
125
  The *associated namespaces* for a call are the innermost enclosing
126
  non-inline namespaces for its associated entities as well as every
127
  element of the inline namespace set [[namespace.def]] of those
128
  namespaces. Argument-dependent lookup finds all declarations of
 
191
  }
192
  ```
193
 
194
  — *end example*]
195
 
196
+ [*Note 4*: The associated namespace can include namespaces already
197
  considered by ordinary unqualified lookup. — *end note*]
198
 
199
  [*Example 3*:
200
 
201
  ``` cpp