exponenta event banner

Правило AUTOSAR C++ 14 A8-2-1

При объявлении шаблонов функций используется синтаксис завершающего возвращаемого типа, если возвращаемый тип зависит от типа параметров.

Описание

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

При объявлении шаблонов функций используется синтаксис конечного возвращаемого типа, если возвращаемый тип зависит от типа параметров.

Объяснение

Когда возвращаемый тип шаблона зависит от типов параметров, использование синтаксиса завершающего возвращаемого типа значительно улучшает читаемость кода.

Например, для внеклассных определений методов использование синтаксиса завершающего возвращаемого типа означает, что нет необходимости использовать полный возвращаемый тип функции вместе с typename ключевое слово. Вместо явного указания полного типа возврата для aMethod в этом примере:

template <typename T>
class aClass {
    public:
      using vectorType = std::vector<T>;
      vectorType aMethod(T const&);
};

//Difficult-to-read method definition
//Part in bold indicates fully qualified return type of method
template <typename T>
typename aClass<T>::vectorType aClass<T>::aMethod(T const &) {
};
Можно использовать синтаксис конечного возвращаемого типа:
template <typename T>
class aClass {
    public:
      using vectorType = std::vector<T>;
      vectorType aMethod(T const&);
};
template <typename T>
auto aClass<T>::aMethod(T const &) -> vectorType {
};

Внедрение Polyspace

Средство проверки помечает объявления шаблонов функций, где явно указанный тип возврата функции шаблона имеет ту же область, что и сама функция шаблона.

Например, в предыдущем примере функция aMethod имеет возвращаемый тип vectorType, который имеет ту же область применения, что и aMethod, а именно класс aClass<T>. Вместо явного указания полного возвращаемого типа можно использовать синтаксис конечного возвращаемого типа.

Поскольку C++ 14 включает вычет возвратного типа, можно использовать auto ключевое слово для объявления универсальных шаблонов при исключении конечного возвращаемого типа. В таких случаях Polyspace ® не вызывает нарушений.

Поиск неисправностей

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

Примеры

развернуть все

#include <vector>
#include<cstdint>

template<class T, class U>
decltype(std::declval<T>() * std::declval<U>()) 
bar(T const& lhs, U const& rhs) {// Noncompliant
  return lhs * rhs;
}

template<class T, class U>
auto foo(T a, U b) -> decltype(a*b){        //Compliant
  return a*b;
}
template<class T, class U>
auto foo2(T a, U b) {        //Compliant
  return a*b;
}

В этом примере объявляются три универсальных шаблона функций:

  • Шаблон bar явно определяет возвращаемый тип. Такие заявления трудно прочитать и понять. Polyspace помечает объявление.

  • Шаблон foo использует ключевое слово auto, а затем задает конечный возвращаемый тип. Такие заявления легко прочитать и понять. Polyspace не помечает объявление.

  • Шаблон foo2 использует ключевое слово auto но пропускает конечный возвращаемый тип. Начиная с C++ 14 компилятор может вывести возвращаемый тип таких шаблонов. Polyspace не помечает объявление.

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

Группа: Деклараторы
Категория: Обязательно, Автоматизировано
Представлен в R2020a