ARRAYSIZE a macro C ++: como funciona?

Ok eu não estouinteiramente um novato, mas não posso dizer que entendi a macro a seguir. A parte mais confusa é a divisão com o valor convertido em size_t: o que diabos isso faz? Especialmente, já que vejo um operador de negação que, até onde sei, pode resultar em um valor zero. Isso não significa que pode levar a um erro de divisão por zero? (A propósito, a macroé correto e funciona lindamente.)

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

questionAnswers(7)

yourAnswerToTheQuestion