exponenta event banner

Правило AUTOSAR C++ 14 A8-5-3

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

Описание

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

Переменная типа auto не должна инициализироваться с помощью {} или = {} baced-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