More putrid beef soup (Was: Re: Implicit string lit conversion to	wstring/dstring)
    H. S. Teoh 
    hsteoh at quickfur.ath.cx
       
    Sat Mar 17 08:57:02 PDT 2012
    
    
  
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
    
    
More information about the Digitalmars-d
mailing list