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