If you instantiate a variable with a function call at compile-time then that function shouldn't be compiled in (AFAIK) unless it's referenced elsewhere. And for disallowing user-code to use such a function that's what access specifiers are for. The beauty of D is that you write a function once and only once, and you can (if it's possible) run it at compile time, or at runtime based on the *call*, not it's definition.
I think you need to slow down with these proposals. This introduces nothing but complications into the language imho.