Anyone know why this CTFE isn't working?
    Lars T. Kyllingstad 
    public at kyllingen.NOSPAMnet
       
    Fri Jul 16 03:57:06 PDT 2010
    
    
  
On Fri, 16 Jul 2010 12:12:38 +0200, Rory McGuire wrote:
> On Fri, 16 Jul 2010 11:58:57 +0200, Lars T. Kyllingstad
> <public at kyllingen.nospamnet> wrote:
> 
>> On Fri, 16 Jul 2010 11:46:48 +0200, Rory McGuire wrote:
>>
>>> import std.stdio;
>>>
>>> struct State {
>>>   string s; string getString() { return s; } static State
>>>   opCall(string s) {
>>>   State ret;
>>>   ret.s = s;
>>>   return ret;
>>>   }
>>> }
>>>
>>> void main() {
>>>   auto s = State("adf");
>>>   pragma(msg, s.getString());
>>> }
>>>
>>> dmd Output: (line 14 is the pragma statement)
>>>
>>> struct.d(14): Error: variable s cannot be read at compile time
>>> struct.d(14): Error: cannot evaluate s.getString() at compile time
>>> s.getString()
>>
>> It's not working because s isn't a compile-time quantity.  Try:
>>
>>   enum s = State("adf");
>>
>> -Lars
> 
> Awesome thanks, worked.
> 
> So is the difference that "auto s" is a Struct which can change whereas
> "enum s" is a constant?
> If it is a constant its just "s" that is constant right?
> 
> Thanks Lars
Yes.  Writing "auto s = State("adf");" is equivalent to writing
  State s = State("adf");
and since s can change at runtime, it would be meaningless to say that it 
has a value at compile time.  However, its *initial value*, the struct 
literal State("adf"), is known at compile time -- otherwise it would be 
impossible to assign it to an enum.
And actually, an enum is not only a constant, it is a manifest constant.  
When you declare "enum x = someFixedValue", the compiler will just 
replace all later uses of x with someFixedValue.  It's basically the same 
as using the literal value in those places.
This has the consequence that you can't take the address of an enum, nor 
pass an enum by reference.  Doing
  enum i = 3;
  int* p = &i;
is equivalent to
  int* p = &3;
which doesn't make sense.
-Lars
    
    
More information about the Digitalmars-d-learn
mailing list