const ref template vs non-template

Ali Çehreli acehreli at yahoo.com
Tue Nov 6 10:34:04 PST 2012


On 11/06/2012 09:18 AM, Dan wrote:
> Why does g(cs) compile but not G(cs)?
>
> Thanks,
> Dan
>
> struct S{}
>
> void g(ref S i) {}
> void g(const ref S i) {}
> void G(T)(ref T i) {}
> void G(T)(const ref T i) {}
>
> void main() {
> S s;
> const(S) cs;
> g(s);
> g(cs);
> G(s);
> // Error: template p.G matches more than one template declaration,
> /p.d(5):G(T) and /p.d(6):G(T)
> // G(cs);
> }
>

Because in the case of cs, T is 'const(S)', matching the following two 
instantiations:

1) ref const(S) i
2) const ref const(S) i

The second line has a redundant const. So, they end up having the same 
signature.

Ali


More information about the Digitalmars-d-learn mailing list