Bug in using string mixins inside of a struct?

Timon Gehr timon.gehr at gmx.ch
Wed Mar 27 03:17:24 PDT 2013


On 03/27/2013 12:22 AM, John Colvin wrote:
> On Tuesday, 26 March 2013 at 23:00:40 UTC, Timon Gehr wrote:
>> ...
>>
>> Bad code. Use enum for compile-time constants.
>>
>> This will work:
>>
>> struct A{
>>     void b(){
>>         size_t y;
>>         mixin(c!("y"));
>>     }
>>
>>     template c(string x){
>>         enum c = "while(" ~ x ~ " < 100){" ~ x ~ "++;}";
>>     }
>> }
>
> Perhaps you can enlighten me:
>
> why does "const c" work if the template is outside the struct, but not
> if it's inside?
>

const c has memory allocated at run time, it would need to be a field of 
A. Because the number of template instantiations is not bounded a 
priori, templates cannot be used to add fields to aggregates:

struct S{
     template T(int x){
         const s = x; // would need one field per instantiation
     }
}

void main(){
     S s;
     auto a = S.T!0.s;
}

struct S{
     template T(int x){
         static const s = x; // static variables work
     }
}

...

Because of a questionable patch (written by Kenji Hara, I think) some 
time ago, the following works:

struct S{
     template T(int x){
         auto s = x; // implicitly static
     }
}

...

I consider this bad language design.

> Also, why doesn't "string c" work even outside of the struct, seeing as
> it's value is completely defined at compile-time?

It is a design decision. Only variables initialized at compile time that 
may not be mutated at run time can be read at compile time.

string c = "123";
immutable d = "1234";

void main(){
     c = "456"; // may change, cannot be read at compile time
     enum x = d; // may not change, can be read at compile time
}






More information about the Digitalmars-d mailing list