Статическое утверждение используется для создания утверждений во время компиляции. Когда статическое утверждение не выполняется, программа просто не компилируется. Это полезно в различных ситуациях, например, если вы реализуете некоторые функции с помощью кода, который критически зависит от объекта unsigned int
, имеющего ровно 32 бита. Вы можете поставить статическое утверждение как это
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
в вашем коде. На другой платформе с типом unsigned int
другого размера компиляция не удастся, что привлечет внимание разработчика к проблемной части кода и посоветует им повторно внедрить или повторно проверить его.
В другом примере вам может потребоваться передать некое интегральное значение в виде void *
указателя на функцию (взломать, но иногда полезно), и вы хотите убедиться, что интегральное значение поместится в указатель
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Возможно, вы захотите активировать, что char
тип подписан
static_assert(CHAR_MIN < 0);
или это интегральное деление с отрицательными значениями округляет до нуля
static_assert(-5 / 2 == -2);
и т. Д.
Утверждения во время выполнения во многих случаях могут использоваться вместо статических утверждений, но утверждения во время выполнения работают только во время выполнения и только тогда, когда управление проходит над утверждением. По этой причине ошибочное утверждение во время выполнения может оставаться неактивным, необнаруженным в течение длительных периодов времени.
Конечно, выражение в статическом утверждении должно быть константой времени компиляции. Это не может быть значением времени выполнения. Для значений времени выполнения у вас нет другого выбора, кроме как использовать обычный assert
.