Missing constexpr specifier

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

Описание

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

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

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

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

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

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

Шашка не помечает локальные, статические переменные.

Риск

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

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

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

Обратите внимание, что const ключевое слово не гарантирует оценку во время компиляции. The 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