Alias this and std.traits.isArray

monarch_dodra monarchdodra at gmail.com
Sat Jan 5 13:57:51 PST 2013


On Saturday, 5 January 2013 at 14:43:49 UTC, David wrote:
> This code worked with dmd 2.060:
>
> import std.stdio;
> import std.traits;
>
> struct OhWhy(S) {
>     S[] arr;
>     alias arr this;
> }
>
> void main() {
> 	static assert(isArray!(OhWhy!(float)));
> 	
> }
>
> But fails with dmd 2.061:
> ss.d(10): Error: static assert  (isArray!(OhWhy!(float))) is 
> false
>
> (same happens with alias this to static arrays and 
> isArray/isStaticArray)
>
>
> Is this intended or a regression? If latter, I'll submit a 
> bug-ticket.

All traits in std trait of the type were explicitly changed to 
return true only if *the exact type* meets the traits requirement.

The rationale is simply tha OhWhy isn't an array. It can be 
implicitly cast to array, but it isn't an array.

This is problematic when instanciating template functions with 
automatic type inference: when you write 
"myTemplateFunction(myOhWhy)", then you will instanciate 
"myTemplateFuction!OhWhy" when what you may have wanted was to 
actually call "myTemplateFunction!(S[])".

The new "isArray" definition protects from that.


More information about the Digitalmars-d mailing list