Автоматический спецификатор не должно использоваться отдельно от следующих случаев: (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® флаги использования auto спецификатор, за исключением случаев, когда он используется в одном из случаев, перечисленных в предыдущем разделе.
Polyspace помечает использование auto объявление переменной, инициализированной с помощью std::initializer_list основного типа.
Polyspace не помечает использование decltype(auto).
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Декларация |
| Категория: Необходимый, Автоматизированный |