Checking if CTFE is used?
Adam D. Ruppe
destructionator at gmail.com
Tue Dec 18 14:32:29 UTC 2018
On Tuesday, 18 December 2018 at 14:23:38 UTC, berni wrote:
>> import std.stdio;
>>
>> class A
>> {
>> static immutable int[4] clue;
>>
>> static this()
>> {
>> if(__ctfe) assert(0, "Yep, CTFE used");
>> foreach (i;0..4) clue[i] = i;
>> }
>> }
CTFE is used if and only if it MUST be used by context. That's a
runtime function, so no ctfe.
Do something like:
int[4] generate() {
int[4] tmp;
foreach(i; 0..4) tmp[i] = i;
return tmp;
}
static immutable int[4] clue = generate();
Since it is an immediate static immutable assign, ctfe MUST be
used, and thus will be used. With your code, you used a runtime
constructor on all runtime variables, so it did it at program
startup.
Generally:
static immutable something = something; // must be ctfe
enum something = something; // makes a ctfe literal (but not
necessarily static storage)
so those patterns force ctfe. While
static immutable something;
something = something; // NOT ctfe because it is a separate
statement!
More information about the Digitalmars-d-learn
mailing list