メインコンテンツ

MISRA C++:2008 Rule 14-6-2

The function chosen by overload resolution shall resolve to a function declared previously in the translation unit.

説明

ルール定義

The function chosen by overload resolution shall resolve to a function declared previously in the translation unit. 1

根拠

一般的に、関数は宣言せずに呼び出すことはできないため、関数呼び出しは事前に宣言された関数に解決されるものと想定されます。ただし、テンプレート内での関数呼び出しのオーバーロード解決の場合は、この想定が満たされません。このオーバーロードの解決は、テンプレートの定義時点ではなく、テンプレートのインスタンス化時点で行われます。そのため、呼び出しは、テンプレート定義の "後" で宣言された関数に解決される可能性があり、予期せぬ結果につながります。以下の例を参照してください。

関数呼び出しが "常に" 事前に宣言された関数に解決されるという想定を満たすには、関数のオーバーロードを宣言してから、その関数を呼び出します。あるいは、スコープ解決演算子 :: または小かっこを使用して、特定の事前に宣言された関数を明示的に呼び出し、オーバーロード解決メカニズムをバイパスします。

Polyspace 実装

チェッカーは、関数または演算子がテンプレート定義の "後" で宣言されている場合に関数テンプレート定義内の関数または演算子に対する呼び出しにフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

void show (int);

namespace helpers {
	struct params {
		operator int () const;
	};
}

template <typename T> void displayParams(T const & arg) {
	show(arg);    //Non-compliant
	::show(arg);  //Compliant 
	(show)(arg);  //Compliant
}

namespace helpers {
	void show (params const &);
}

void main() {
	helpers::params aParam;
	displayParams(aParam);
}

この例では、テンプレート displayParams 内の呼び出し show(arg)helpers::show() に解決されますが、helpers::show() は後で宣言されるため、開発者またはコード レビュー担当者はこの呼び出し解決を想定しない可能性があります。Polyspace は、この呼び出しにフラグを設定します。

呼び出しの ::show(arg)(show)(arg) は、グローバル名前空間で事前に宣言された関数 show() を明示的に指定しています。Polyspace は、これらの呼び出しにはフラグを設定しません。

チェック情報

グループ: Templates
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.