AUTOSAR C++14 Rule A14-5-3
A non-member generic operator shall only be declared in a namespace that does not contain class (struct) type, enum type or union type declarations
説明
ルール定義
A non-member generic operator shall only be declared in a namespace that does not contain class (struct) type, enum type or union type declarations.
根拠
このルールは、クラス (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® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: テンプレート |
| カテゴリ: Advisory、Automated |