メインコンテンツ

AUTOSAR C++14 Rule A8-2-1

When declaring function templates, the trailing return type syntax shall be used if the return type depends on the type of parameters

説明

ルール定義

関数テンプレートの宣言時に、戻り値の型がパラメーターの型に依存する場合は、後続の戻り値の型の構文を使用するものとします。

根拠

テンプレートの戻り値の型がパラメーターの型に依存する場合は、後続の戻り値の型の構文を使用すれば、コードの可読性が大幅に向上します。

たとえば、メソッドのクラス外定義では、後続の戻り値の型の構文を使用すれば、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® が違反を報告しません。

トラブルシューティング

ルール違反が想定されるものの、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;
}

この例では、3 つの汎用関数テンプレートが宣言されます。

  • bar テンプレートは、戻り値の型を明示的に定義します。このような宣言は読みづらく、わかりにくいため、Polyspace は宣言にフラグを設定します。

  • foo テンプレートは、auto キーワードを使用してから、後続の戻り値の型を指定します。このような宣言は、読みやすく、わかりやすいため、Polyspace は宣言にフラグを設定しません。

  • foo2 テンプレートは、auto キーワードを使用しますが、後続の戻り値の型を省略します。C++14 以降では、コンパイラがこのようなテンプレートの戻り値の型を推定できるため、Polyspace は宣言にフラグを設定しません。

チェック情報

グループ: 宣言子
カテゴリ: Required、Automated

バージョン履歴

R2020a で導入