one
Here is how I think your first case, t.Dependent::f works. Firstly, I believe (which means I'm not quite sure) that 14.6.2.1p5 should say "unqualified-id" instead of "id-expression". But regardless of this, your name Dependent::f actually consists of two names (in the standard, each nested nested qualifier name followed by the participant name is called "qualified-id", even if it is grammatically, they are not qualified - Id. Thus, the name foo::bar::baz is a qualified identifier, but also contains another "qualified identifier").
Dependent and Dependent::f . The first is not an “Identifier denoting an element in a class member access expression”, so you cannot just apply the rule applicable to Dependent::f to apply also to Dependent .
Dependent is independent of this, and although it must be looked for in a dependent type, it must be found during the definition. I personally think that we should have a sentence that says: "When you look at a qualified identifier, where the qualifier depends on the type, a search by name gives an empty result." In order to process these “forced names” that need to be executed immediately “gracefully, Anyway, in the end, I think your first case is poorly formed without finding Dependent (paragraph 3.4 cannot simply solve chapter 14 on its own, which the name actually depends on it).
2
In another case, operator Dependent is simpler. You again have two names, Dependent and operator Dependent . Again, I did not find anything that says Dependent is a dependent name here (I'm not sure if this would be wrong or not. It's outside of me).
Comparison of the search by name (say, the equality function in the hash table of the search for names) for the names of the operator’s functional functions: “they are transform identifiers formed with the same type” (3.8). This means that in order to form the name itself (not yet searching by name!), You must not only give a lexical spelling, as for identifiers, but you must provide an identifier of the type that must be provided by Dependent .
To delay the search for the dependent id expression in t.operator Dependent* , simply means that the comparison of the semantic type is delayed. Try this one that should work well
struct Dependent;
Your escort
If it is assumed that such a name is independent, what is the rationale for this decision? I see that this makes life easier for the developer if they don’t need to postpone a construction evaluation of type t.operator X :: Dependent * or tX :: Dependent :: f, where X can be either a namespace or a name type.
I do not know the rationale, but I think that you have already given a good moment. This is very similar to a rule that skips dependent base classes when looking for unqualified names. And I think that this justification is applicable for this case. This facilitates the discussion of the function template for the programmer, especially.
struct Dependent; template<typename T> void f(T t) { t.Dependent::f(); t.operator Dependent*(); }
The code looks fine, but if T is a member of the Dependent , suddenly Dependent will have a different binding (because first we are told to study a class T , and then in the environment volume). In my understanding of template rules, the above always refers to the surrounding Dependent area, so the code above is “safe” for this trap.