Created on 2004-07-12.00:00:00 last changed 29 months ago
Rationale
The wording correctly reflects the intent; block-scope allocation functions are not found by the special lookup in a new-expression.
Notes from October 2004 meeting:
The CWG agreed that the block-scope declaration should not be found by the lookup in a new-expression. It would, however, be found by ordinary lookup if the allocation function were invoked explicitly.
Looking up operator new in a new-expression uses a different mechanism from ordinary lookup. According to 7.6.2.8 [expr.new] paragraph 9,
If the new-expression begins with a unary :: operator, the allocation function's name is looked up in the global scope. Otherwise, if the allocated type is a class type T or array thereof, the allocation function's name is looked up in the scope of T. If this lookup fails to find the name, or if the allocated type is not a class type, the allocation function's name is looked up in the global scope.
Note in particular that the scope in which the new-expression occurs is not considered. For example,
void f() {
void* operator new(std::size_t, void*);
int* i = new int; // okay?
}
In this example, the implicit reference to operator new(std::size_t) finds the global declaration, even though the block-scope declaration of operator new with a different signature would hide it from an ordinary reference.
This seems strange; either the block-scope declaration should be ill-formed or it should be found by the lookup.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2023-07-02 20:55:11 | admin | set | messages: + msg7352 |
| 2023-07-02 20:55:11 | admin | set | status: open -> nad |
| 2004-11-07 00:00:00 | admin | set | messages: + msg1082 |
| 2004-07-12 00:00:00 | admin | create | |