https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102609

--- Comment #14 from Barry Revzin <barry.revzin at gmail dot com> ---
> I am finding myself realizing that implementing this as a member function and 
> turning off member function bits seems to be more difficult than implementing 
> it as a static function and implementing member function bits will be.

That's how I implemented this in EDG - static member functions that just have
some extra powers. 

> Of these cases, is f0 or f1 and g0 or g1 correct? I assume the answer is f1 
> and g1.

Both are correct - you're still a member of S, so you don't have to qualify
S::my_type (I mean, you can, it's not incorrect, but it's just not necessary -
means the same thing either way).

> When deduced, f0 or f1 and g0 or g1? I would definitely think f1 and g1 now.

These now might actually mean different things. Unqualified my_type is still
valid and means S::my_type (i.e. int). But Self::my_type could now mean a
different type. Merging the two examples:

struct S {
    using my_type = int;

    template<typename Self>
    void f0(this Self, my_type);

    template<typename Self>
    void f1(this Self, Self::my_type);
};

struct D : S {
    using my_type = double;
};

D().f0(2.0); // calls S::f0<D>, which takes an int
D().f1(2.0); // calls S::f1<D>, which takes a double

Reply via email to