On Wed, Mar 14, 2012 at 02:07:04PM -0500, Andrei Alexandrescu wrote:
[...]
> Aha! This is one of those cases in which built-in magic smells of
> putrid beef soup.
[...]

It gets worse than we first thought:

        void f1(dstring x) { dstring y = x; }

        void f2()(dstring x) { dstring y = x; }
        void f2(U)(U x) if (!is(U==string)) { dstring y = x; }

        void f3(byte[] x) { byte[] y = x; }

        void f4()(byte[] x) { byte[] y = x; }
        void f4(U)(U x) if (!is(U==int[])) { byte[] y = x; }

        void main() {
                f1("abc");      // OK: "abc" deduced as dstring

                f2("abc");      // OK: "abc" defaults to string, but f2(U)(U)
                                // declines U==string, so f2()(dstring) is
                                // chosen, and "abc" is deduced as dstring

                f3([1,2,3]);    // OK: [1,2,3] deduced as byte[]

                f4([1,2,3]);    // Error: template test2.f4() does not match 
any function template declaration
                                // Error: template test2.f4() cannot deduce 
template function from argument types !()(int[])
        }

WAT?? So "abc" will match f()(dstring x), but [1,2,3] doesn't match
f()(byte[] b)?

Upon further investigation:

        void f5(dstring s) {}
        void f6()(dstring s) {}
        void f7(byte[] s) {}
        void f8()(byte[] s) {}
        void main() {
                f5("abc");      // OK
                f6("abc");      // OK (!)
                f7([1,2,3]);    // OK

                f8([1,2,3]);    // cannot deduce template function from 
argument types !()(int[])
        }

WAT?


T

-- 
"You know, maybe we don't *need* enemies." "Yeah, best friends are about all I 
can take." -- Calvin & Hobbes

Reply via email to