The disambiguation is purely syntactic; that is, the meaning of the
names occurring in such a statement, beyond whether they are
type-names or not, is not generally used in or changed by the
disambiguation
. Class templates are instantiated as necessary to
determine if a qualified name is a
type-name. Disambiguation
precedes parsing, and a statement disambiguated as a declaration may be
an ill-formed declaration
. If, during parsing, lookup finds
that a name in a template argument is bound to
(part of) the declaration being parsed,
the program is ill-formed
. No diagnostic is required
. [
Example 3:
struct T1 {
T1 operator()(int x) { return T1(x); }
int operator=(int x) { return x; }
T1(int) { }
};
struct T2 { T2(int) { } };
int a, (*(*b)(T2))(int), c, d;
void f() {
T1(a) = 3,
T2(4),
(*(*b)(T2(c)))(int(d));
}
—
end example]