ARRAYSIZE macro de C ++: ¿cómo funciona?

OK no estoyenteramente un novato, pero no puedo decir que entiendo la siguiente macro. La parte más confusa es la división con valor emitido a size_t: ¿qué demonios logra eso? Especialmente, ya que veo un operador de negación, que, hasta donde yo sé, podría resultar en un valor cero. ¿No significa esto que puede conducir a un error de división por cero? (Por cierto, la macroes correcto y funciona muy bien.)

#define ARRAYSIZE(a) \
  ((sizeof(a) / sizeof(*(a))) / \
  static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))