Actually, functions in general can be constants. E.g. this works:
constant my_mkdirhier = Stdio.mkdirhier;
(except if you try to do it in the Stdio module itself). The problem is that a (pike) function pointer is really an object along with an index in the identifier table, and the compiler requires it exist when the constant definition is compiled. So when you refer to a function in the same class:
class X { int a() {return 1;} constant b = a; }
then a cannot be converted to a function pointer to store in the constant b since there is no instance of X to use in it.
So this case has to be recognized with a special case and must be converted to an alias in the identifier table; b can never be an "ordinary" constant. There'd be fairly little difference on the pike level, but quite a big one in the internal program structs.