How is `auto` and not `alias` appropriate for alias sequences?

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Fri Dec 11 06:22:29 PST 2015


On 12/11/2015 12:18 PM, Shriramana Sharma wrote:
> Hello. I just found that the following code compiles without any problem:
>
>      struct Foo { int val; string name; }
>      Foo foo = {1, "one"};
>      auto t = foo.tupleof;
>
> Trying to use `alias` i.o. `auto` above fails.
> ...

The alias should compile. This is a compiler bug.
Workaround:

import std.stdio;
alias Seq(T...)=T;

void main(){
     struct Foo{int val;string name;}
     Foo foo={1,"one"};
     alias t=Seq!(foo.tupleof);
}

However, this still might not do what you want. The above alias is the 
same as alias t=Seq!(Foo.tupleof);. This is a general and arbitrary 
limitation of alias declarations.


> Now IIUC, trying to take the address of t fails, so it's still a compile-
> time-only construct without "real" i.e. runtime existence. The tuple is in
> fact an AliasSeq, no? In which case, I would have thought that `alias` (for
> compile-time symbols) and not `auto` (for runtime variables) would be the
> appropriate choice.
>
> Can someone please explain this situation? Thanks.
>

The line

auto t=foo.tupleof;

declares two variables and aliases them into a Seq of name 't'.
(It is the same as Seq!(int,string) t=foo.tupleof; )
t[0] and t[1] are two distinct variables. This is also why you were not 
able take the address of t.




More information about the Digitalmars-d mailing list