Compile-time function execution (i.e. constexpr function in C++, or RFC #911) is different from compile-time code generation (i.e. the mixin() expression in D).
D’s power partly comes from the ability to generate strings that can be pasted directly into code while compiling. It is mixin() which is magical, CTFE is pretty harmless and much less powerful on its own.
For instance you could parse an arbitrary complex string and create a complicated struct instance (e.g. to reproduce the regex! macro) (not available in RFC #911 yet, control structure is not supported), but you cannot create a new item (e.g. bitfield!, defining coroutines, etc.) with CTFE alone.