Non compile time evaluation for initializers

Max Samukha samukha at voliacable.com.removethis
Fri Oct 26 08:10:02 PDT 2007


On Fri, 26 Oct 2007 15:45:45 +0200, Lutger
<lutger.blijdestijn at gmail.com> wrote:

>Max Samukha wrote:
>> On Fri, 26 Oct 2007 10:52:25 +0200, Lutger
>> <lutger.blijdestijn at gmail.com> wrote:
>> 
>>> Lutger wrote:
>>>> Janice Caron wrote:
>>> ...
>>>> Suppose this is implemented, then how can you achieve constant folding 
>>>> with CTFE in initializers? Since it is not a compile time context 
>>>> anymore, all functions that substitue y will be evaluated at runtime.
>>> Nevermind, I responded too soon and overlooked the proviso that it's 
>>> only rewritten when it doesn't compile, sorry.
>> 
>> Then if a compile time function is messed up in a way that makes it
>> unevaluatable at compile time, it would be silently used at run-time,
>> which is not desired?
>
>Hmm yes, it's still an issue. Some functions are quite inefficient for 
>example if they are made to be evaluated at compile time, which doesn't 
>matter in that context but does for the runtime case.

As Reiner mentioned, the problem is that static variables should not
be initialized at compile-time at all. If you want CTFE put the
initializers in const context.

int foo()
{
   return 1;
}

static int x = foo; // module scope, static is optional; foo would be
evaluated on module construction

class C
{
   static x = foo; // ditto
}

void bar()
{
  static x = foo; // ditto
}

Then 'static' keyword here would mean 'global' and compile time
constructs would have to be changed to 'const if', 'const assert', etc
(Don't beat me please!)
 



More information about the Digitalmars-d mailing list