On Monday, 10 December 2018 at 16:15:36 UTC, aliak wrote:

Ah, that's a good way of breaking it down. But ok, so then the other version would be lowered to:

template match(handlers...) {
    template match(T) {
        auto match(T holder) {
            return handlers[0](holder);
        }
    }
}

So now the second template is accessing a T, which is actually a Holder!f right? But doing that makes it "work". Even though the number of "contexts" needed to execute "handlers[0](holder)" is the same, right?

Holder!f is a type, not a delegate, so passing it as a parameter to a non-global template is fine. Issue 5710 only applies to delegates passed directly as parameters.

Trying to reason about the "number of contexts" required is a waste of time. There's no logical, principled reason why one works and the other doesn't. It's purely an artifact of details in the compiler implementation.

Reply via email to