exponenta event banner

AUTOSAR C++14 Rule A7-1-5

Автоматический спецификатор не должно использоваться отдельно от следующих случаев: (1) объявить, что переменная имеет тот же тип, что и возвращаемый тип вызова функции, (2) объявить, что переменная имеет тот же тип, что и инициализатор неосновного типа, (3) объявить параметры типового лямбда-выражения, (4) объявить шаблон функции с помощью конечного синтаксиса типа возврата

Описание

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

Автоматический спецификатор не должно использоваться отдельно от следующих случаев: (1) объявить, что переменная имеет тот же тип, что и возвращаемый тип вызова функции, (2) объявить, что переменная имеет тот же тип, что и инициализатор неосновного типа, (3) объявить параметры типового лямбда-выражения, (4) объявить шаблон функции с помощью конечного синтаксиса возвращаемого типа.

Объяснение

Когда вы используете auto спецификатор типа с объявлением переменной, тип переменной выводится компилятором. Разработчик, читающий код, может быть запутан, если тип вычета не тот, который он или она ожидал. Информация, необходимая для вывода типа, может находиться в отдельной части кода.

Это правило позволяет использовать auto спецификатор в следующих случаях:

  • Вы объявляете переменную, которая инициализирована вызовом функции. Это избегает повторения типа и гарантирует отсутствие неожиданных преобразований, если вы изменяете тип возврата функции. Для примера в этом фрагменте кода переменная var имеет тот же тип, что и тип возврата myfunc():

    #include<cstdint>
    
    int32_t myfunc();
    
    int foo(){
      auto var=myfunc();
      return var;
    }

  • Вы объявляете переменную, которую вы инициализируете с неосновным инициализатором типа. Тип T не является фундаментальным, если std::is_fundatmental<T>::value является ложным. Список основных типов см. в разделе Основные типы. Для примера - тип var в этом фрагменте кода std::vector<int>::iterator.

    std::vector<int> v = { 1, 2, 3};
    auto var = v.begin();
    При помощи auto ключевое слово, вы делаете код более читаемым и избегаете необходимости писать трудный для запоминания непостоянный тип.

    Обратите внимание, что указатель является неосновным типом.

  • Вы объявляете параметры типовой лямбда-функции. Функция может затем принять несколько типов параметров, аналогичных шаблону функции. Например, пользовательская реализация std::sort в этом фрагменте кода может использоваться для сортировки векторов ints, или floats, или других арифметических типов.

    //sort in ascending order
    std::sort(v.begin(), v.end(),
                  [](auto lhs, auto rhs){
                      return lhs < rhs});
    

  • Для объявления шаблона функции используется конечный синтаксис типа возврата. В этом случае вычет по типу отсутствует. The auto ключевое слово используется как часть альтернативного синтаксиса для объявления шаблонов функций. Этот фрагмент кода показывает пример конечного синтаксиса типа возврата.

    template<typename T, typename U>
    auto subtract(T lhs, U rhs) -> decltype(lhs - rhs);
    

Реализация Polyspace

  • Polyspace® флаги использования auto спецификатор, за исключением случаев, когда он используется в одном из случаев, перечисленных в предыдущем разделе.

  • Polyspace помечает использование auto объявление переменной, инициализированной с помощью std::initializer_list основного типа.

  • Polyspace не помечает использование decltype(auto).

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

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

Примеры

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

#include <string>
#include<vector>

auto func(int a)   // Non-compliant
{
    return a;
}

void func2()
{
    auto int_type = new int[5];           //  Non-compliant

    auto vector_type = std::vector<int> { 1, 2, 3 }; // Compliant

    const char* c = "hello";
    auto str2 =  std::string(c); // Compliant

    auto lambda = [](auto x, auto y) { // Compliant
        return x > y;
    };


}


В этом примере использование auto спецификатор для типа возврата func не соответствует требованиям. Выведенный тип возврата функции может быть неясным. Точно так же использование auto в объявлении int_type не совместим, поскольку инициализатор этой переменной является массивом типов int, который является основным типом.

Другие виды применения auto в этом примере совместимы со сценариями использования, заданными этим правилом:

  • Инициализаторы vector_type и str2 являются неосновополагающими типами std::vector<int> и stdd::string соответственно (пример использования (2)).

  • Инициализатор переменных lambda является лямбда-выражением не фундаментального типа (пример использования (2))

  • Переменные x и y являются параметрами лямбда-выражения (use case (3)).

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

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