AUTOSAR C++14 Rule A7-1-2

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

Описание

Определение правила

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

Объяснение

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

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

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

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

Реализация Polyspace

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

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

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

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

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

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

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

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

void initialize(void) {
    double eVal = 2.718; //Noncompliant
    double eValSquare = squareIfPositive(2.718); //Noncompliant
    const double eValCubed = 2.718 * 2.718 * 2.718; //Noncompliant
    
    constexpr double eValSquareAnother = square(2.718); //Compliant
}

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

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

Группа: Декларация
Категория: Необходимый, Автоматизированный
Введенный в R2020b