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.