Created on 2006-12-05.00:00:00 last changed 40 months ago
Notes from the October, 2009 meeting:
The eventual resolution of this issue should take into account the template parameter scope introduced by the resolution of issue 481.
[Accepted at the November, 2020 meeting as part of paper P1787R6 and moved to DR at the February, 2021 meeting.]
In an example like,
struct Y {};
template <typename T>
struct X : public virtual Y { };
template <typename T>
class A : public X<T> {
template <typename S>
A (S)
: S ()
{
}
};
template A<int>::A (Y);
Should S be found? (S is a dependent name, so if it resolves to a base class type in the instantiated template, it should satisfy the requirements.) All the compilers I tried allowed this example, but 11.9.3 [class.base.init] paragraph 2 says,
Names in a mem-initializer-id are looked up in the scope of the constructor's class and, if not found in that scope, are looked up in the scope containing the constructor's definition.
The name S is not declared in those scopes.
Mike Miller: Here's another example that is accepted by most/all compilers but not by the current wording:
namespace N {
struct B { B(int); };
typedef B typedef_B;
struct D: B {
D();
};
}
N::D::D(): typedef_B(0) { }
Except for the fact that the constructor function parameter names are ignored (see paragraph 7), what the compilers seem to be doing is essentially ordinary unqualified name lookup.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-08-19 07:54:33 | admin | set | status: drwp -> cd6 |
| 2021-02-24 00:00:00 | admin | set | status: accepted -> drwp |
| 2020-12-15 00:00:00 | admin | set | status: open -> accepted |
| 2009-11-08 00:00:00 | admin | set | messages: + msg2407 |
| 2006-12-05 00:00:00 | admin | create | |