> Compile time asserts can be created using #error
Really not the same thing. Compile time asserts allow you to check any compile time value. For instance say you were writing OpenGL code and your struct needs to have a size that is a multiple of 16 bytes. In D that's easy:
static assert(sizeof(Data) % 16 == 0);