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 явным образом задает возвращаться-тип. Такие объявления затрудняют, чтобы читать и понять. Polyspace отмечает объявление.

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

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

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

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