MISRA C++:2008 Rule 14-5-1
A non-member generic function shall only be declared in a namespace that is not an associated namespace
説明
ルール定義
A non-member generic function shall only be declared in a namespace that is not an associated namespace. 1
根拠
このルールは、クラス (struct) 型、列挙型、または共用体型の宣言と同じ名前空間への汎用関数の配置を禁止しています。クラス型、列挙型、または共用体型がテンプレート パラメーターとして使用されている場合は、同じ名前空間内に汎用関数が存在すると、予期せぬ呼び出し解決が発生する可能性があります。汎用関数は、クラス型、列挙型、または共用体型と関連付けることができない名前空間にのみ配置してください。
クラス B と operator== の一般形式を組み合わせた名前空間 NS を考えます。
namespace NS {
class B {};
template <typename T> bool operator==(T, std::int32_t);
}
B を次のテンプレート クラス A のような別の汎用クラスのテンプレート パラメーターとして使用する場合:template <typename T> class A {
public:
bool operator==(std::int64_t);
}
template class A<NS::B>;
A の演算子が呼び出されたときに、名前空間 NS 全体がオーバーロード解決に使用されます。たとえば、int32_t 引数を指定して operator== を呼び出すと、名前空間 NS 内の汎用 operator== と int32_t パラメーターが、オリジナルのテンプレート クラス A 内の operator== と int64_t パラメーターの代わりに使用されます。開発者またはコード レビュー担当者は、オリジナルのテンプレート クラス A 内の operator== に解決するための演算子呼び出しを想定する可能性があります。Polyspace 実装
汎用関数ごとに、ルール チェッカーが、配置先の名前空間にクラス型、列挙型、または共用体型の宣言も含まれているかどうかを判断します。このような宣言が見つかった場合は、チェッカーが演算子自体に対するルール違反にフラグを設定します。
また、グローバル名前空間にもクラス、列挙、または共用体の宣言が含まれている場合は、チェッカーがグローバル名前空間で定義された汎用関数にもフラグを設定します。
トラブルシューティング
ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: テンプレート |
| カテゴリ: 必要 |
バージョン履歴
R2020b で導入
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.