Missing constexpr specifier

constexpr спецификатор может используемый по выражению для оценки времени компиляции

Описание

Этот дефект происходит, если вы не используете constexpr спецификатор, когда переменная инициализируется при помощи выражения, которое может быть выполнено во время компиляции.

Дефектное средство проверки отмечает определение локальной переменной без constexpr спецификатор, если переменная инициализируется одним из следующих и не изменяется впоследствии в коде:

  • Постоянное время компиляции, например, литеральное значение.

  • Выражение, включающее константы времени компиляции только.

  • Вызовы функции с константами времени компиляции как параметры, если функцией является самостоятельно constexpr или функция содержит только оператор возврата, включающий его параметры.

  • Вызов конструктора с постоянным временем компиляции, обеспечил, всеми функциями членства класса включая конструктора является самостоятельно constexpr.

Средство проверки не отмечает локальные, статические переменные.

Риск

Если значение переменных вычисляется из выражения, которое включает константы времени компиляции только, с помощью constexpr перед определением переменной, как это:

constexpr double eValSquared = 2.718*2.718;
гарантирует, что выражение выполнено во время компиляции. Оценка времени компиляции экономит на издержках во время выполнения. Иногда, увеличение производительности во время выполнения может быть значительным.

Если выражение не может быть выполнено во время компиляции, constexpr ключевое слово гарантирует, что вы получаете ошибку компиляции. Можно затем устранить базовую проблему, если это возможно.

Обратите внимание на то, что const ключевое слово не гарантирует оценку времени компиляции. const ключевое слово просто запрещает прямую модификацию значения переменных после инициализации. В зависимости от того, как инициализируется переменная, инициализация может произойти во время компиляции или время выполнения.

Фиксация

Добавьте constexpr спецификатор к определению переменной.

Примеры

развернуть все

double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    double eVal = 2.718; 
    double eValSquare = squareIfPositive(2.718);
    const double eValCubed = 2.718 * 2.718 * 2.718;
}

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

Коррекция – добавляет constexpr Спецификатор
constexpr double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    constexpr double eVal = 2.718; 
    constexpr double eValSquare = squareIfPositive(2.718);
    constexpr double eValCubed = 2.718 * 2.718 * 2.718;
}

Добавьте constexpr спецификатор к определениям переменной. Чтобы избежать ошибок времени компиляции, убедитесь что функциональный squareIfPositive, который возвращает значение к constexpr переменная, самостоятельно constexpr.

Проверяйте информацию

Группа: Производительность
Язык: C++
Значение по умолчанию: Off
Синтаксис командной строки: MISSING_CONSTEXPR
Удар: носитель
Введенный в R2020b