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 ключевое слово, вы делаете код более читаемым и избегаете необходимости писать трудное, чтобы помнить нефундаментальный тип.

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

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

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

  • Вы используете запаздывание, возвращают синтаксис типа, чтобы объявить шаблон функции. В этом случае нет никакого вычета типа. 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 лямбда-выражение типа non-fundametal (вариант использования (2))

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

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

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