AUTOSAR C++14 Rule 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 явно задает тип return-type. Такие заявления трудно прочитать и понять. Polyspace помечает объявление.

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

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

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

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