AUTOSAR C++14 Rule A8-5-3

Переменная типа auto не должна быть инициализирована с помощью {} или = {} braced-initialization

Описание

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

Переменная типа auto не должна быть инициализирована с помощью {} или = {} braced-initialization.

Объяснение

Вычет по типу для auto имеет контринтуитивный результат, когда инициализация использует скобки. Выводимый тип std::initializer_list<> вместо типа, который можно угадать из инициализатора.

Для образца, определение:

auto x{1};
результаты в типе x будучи std::initializer_list<int> вместо int. Некоторые компиляторы выводят int тип из этого определения, но поведение неоднородно для компиляторов.

Реализация Polyspace

Шашка помечает определения переменных, которые используют тип auto если переменная инициализирована с помощью {} или ={} инициализация скобок.

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

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

Примеры

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

#include<initializer_list>

void func() {
    auto aVar{1}; //Noncompliant
    auto anotherVar(1); //Compliant
    int aThirdVar{1}; //Compliant
    
    auto aVarList{1,2,3}; //Noncompliant
    std::initializer_list<int> anotherVarList{1,2,3}; //Compliant
}

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

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

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