Compile-time constness is waaay to strict!

KennyTM~ kennytm at gmail.com
Sat Jul 25 05:22:43 PDT 2009


asd wrote:
> Daniel Keep Wrote:
> 
>>>> bool isEmptyString(string str) {
>>>>        static if (str == "") return true;
>>> It works if you use 'if' instead of 'static if', oddly.
>>>
>>>>        return false;
>>>> }
>>>>
>>>> void main()
>>>> {
>>>>        static if (isEmptyString(""))
>>>>        {
>>>>                int x = 1;
>>>>        }
>>>> }
>>>>
>>>>
>>>> test.d(5): Error: expression str == "" is not constant or does not evaluate to a bool
>>>> test.d(11): Error: cannot evaluate isEmptyString("") at compile time
>>>> test.d(11): Error: expression isEmptyString("") is not constant or does not evaluate to a bool
>>> Be sure to report this on Bugzilla: http://d.puremagic.com/issues/
>> I don't think this is a bug in DMD.
>>
>> It can't execute it at compile-time because it CANNOT COMPILE IT.
>>
>> str is a run-time argument.  static if requires a compile-time expression.
>>
>> You can't feed runtime constructs to compile-time ones.  Evaluating a
>> function at compile time doesn't change that.
> 
> That's a shame. This distinction doesn't make sense to me -- it is clearly possible to know value of this function at compile time and there's no way to change the result at run time.
> 
> If it's not a bug, I've filed it as feature request then: http://d.puremagic.com/issues/show_bug.cgi?id=3209

It makes sense. A compile-time function must be executable in run time 
as well. Which means both of the following must be meaningful.

void main () {
   auto s = readln();
   if (isEmptyString(s)) { ... } // Run time executed
}

void main2 () {
   static if (isEmptyString("")) { ... } // Compile time executed
}

If you use static if in isEmptyString, the run time counterpart is 
meaningless.



More information about the Digitalmars-d mailing list