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