AUTOSAR C++14 Rule A7-1-2

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

Описание

Управляйте определением

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

Объяснение

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

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

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

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