Любая причина использовать утверждение времени выполнения вместо утверждения времени компиляции? - PullRequest
5 голосов
/ 07 сентября 2010

При просмотре кодовой базы Visual C ++ я обнаружил следующую странную вещь.Утверждение времени выполнения (которое проверяет условие и выдает исключение, если условие нарушено ) использовалось в случае, когда условие могло быть оценено во время компиляции:

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );

ясно, что компилятор оценит условие и заменит код, который фактически будет либо

assert( true );

, который ничего не делает, либо

assert( false );

, который выдает исключение каждый раз, когда управление проходит через эту строку.

IMO вместо этого следует использовать утверждение времени компиляции по следующим причинам:

  • это выявит нарушение условия раньше - во время компиляции - и
  • это позволило бы генерировать более чистый (таким образом, более быстрый и меньший) машинный код

Похоже, утверждение времени компиляции - единственно правильная вещь.Есть ли какая-либо возможная причина, чтобы предпочесть утверждение времени выполнения здесь?

Ответы [ 2 ]

16 голосов
/ 07 сентября 2010

Нет причин предпочитать утверждать во время выполнения здесь.Вы должны отдавать предпочтение ошибкам во время компиляции, а не ошибкам во время выполнения, поэтому нет никакой причины, учитывая опцию между ними, выбирать утверждение во время выполнения.

Однако, если статическое утверждение не является вариантом(не знает концепции статического утверждения, не знает, как его создать и не имеет его в наличии, или не знает, как его создать, но у него нет времени), утверждение во время выполненияследующая лучшая вещь.

В C ++ 0x встроенная функция static_assert должна закончить все основания для использования подтверждения во время выполнения, где будет работать утверждение во время компиляции.

4 голосов
/ 07 сентября 2010

Мы не можем сказать без контекста.В коде шаблона некоторые ветви могут быть недоступны для некоторых экземпляров.Утверждение времени компиляции было бы неуместным, так как это делает всю функцию неосведомленной.assert(<type-dependent expression>) - нет.

Например,

template <typename T> void foo(T t)
{
  if (t < 0) {
    assert(std::numeric_limits<T>::min() < 0);
    T u = t - std::numeric_limits<T>::min();
  }
}

Утверждение не может быть преобразовано в статическое утверждение, даже если подтверждение во время выполнения никогда не завершается неудачей.

...