1) Ключевое слово static_assert служит для проверки и выброса сообщений на ошибки на этапе компиляции, введено в С++11 и изменено в С++17.
static_assert( bool-constexpr , message ) // (начиная с C++11)
static_assert( bool-constexpr ) // (начиная с C++17)
/* Где:
bool-constexpr - логическое выражение возвращающее true или false (не ноль и ноль соответственно, для целочисленных значений)
message - выбрасываемое сообщение
2) Выбрасывание ошибки при компиляции и использовании static_assert происходит если (условие (bool-constexpr) равно false или 0
3) Польза от использования static_assert состоит именно в том, что ошибку можно обнаружить на этапе компиляции (об этом и говорит слово static в наименовании) и не произойдет (пользователь не увидит) аварийного завершения программы. Но static_assert можно применить только к условиями которые известны на этапе компиляции и поэтому не подходит для всех случаев, например когда условия известны только на этапе выполнения программы - зависят от действий пользователя или приходящей информации по сети, USB и т.д..
int main() {
const int SIZE = 10;
static_assert(SIZE < 5, "SIZE too big"); // C++11 Произойдет ошибка при компиляции
static_assert(0); // C++17 Произойдет ошибка при компиляции
}