メインコンテンツ

AUTOSAR C++14 Rule A13-5-3

User-defined conversion operators should not be used

R2021a 以降

説明

ルール定義

User-defined conversion operators should not be used.

根拠

ユーザー定義の変換演算子は、必要でもなく、想定してもいないときに呼び出される場合があります。その場合、予期せぬ型変換エラーが発生する可能性があります。たとえばこのコード スニペットでは、ユーザー定義の変換演算子が customType 型を double 型に変換することにより、混合モード表現式を許可します。

class customType
{
	public:
	customType(int base, int exponent);
	//....
	operator double() const; // Conversion operator, convert customType to double
};

customType var1(2,5);
double var2 = 0.5 * var1; //Conversion operator called, converts var1 to double
これが意図された変換であるとしても、customType オブジェクトに operator << を定義せずに cout << var1; を使用して var1 を出力しようとすると、コンパイラはこの変換演算子を使用して暗黙的に var1 を変換し、double として出力します。

このような想定外の変換を回避するには、変換演算子を同等の関数で置き換えます。その関数は、明示的に呼び出す必要があります。アプリケーションで変換演算子の使用を回避できない場合は、AUTOSAR C++14 Rule A13-5-2 のルールを参照してください。

Polyspace 実装

Polyspace® は、変換演算子のすべての呼び出しにフラグを設定します。

トラブルシューティング

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

すべて展開する

class customType
{
public:
    customType(int base, int exponent): b(base), exp(exponent) { /* ...*/}
    //....
    operator double() const;
    double as_double() const {/* ...*/}

private:
    int b; //base
    int exp; //exponent
};

int func(void)
{

    customType var1(2, 5);
    double var2 = 0.5 * var1; //Non-compliant
    double var3 = 0.5 * var1.as_double(); // Compliant

    return 0;
}

この例では、var2 の宣言での var1 から double への変換で、変換演算子 customType::operator double を使用しています。ユーザー定義の変換演算子を使用しているため、この変換は非準拠です。

var3 の宣言での型変換は、関数を使用して変換を処理しているため、準拠しています。この関数は、明示的に呼び出す必要があります。これにより確実に想定どおりの変換になります。

チェック情報

グループ: オーバーロード
カテゴリ: Advisory、Automated

バージョン履歴

R2021a で導入