メインコンテンツ

AUTOSAR C++14 Rule A13-5-2

All user-defined conversion operators shall be defined explicit

説明

ルール定義

All user-defined conversion operators shall be defined explicit.

根拠

ユーザー定義の変換演算子を定義する際に explicit 指定子を使用しなかった場合、コンパイラは暗黙的で、しばしば意図的ではない型変換をクラス型との間で実行することがあり、予期せぬ結果が生じる可能性があります。

たとえば、引数として渡したクラス型とは異なる型のパラメーターを関数が受け取る場合は、暗黙的変換が行われる可能性があります。一例として、以下の func の呼び出しでは、myClass 型から int 型への暗黙的変換が行われます。

class myClass {} {
  ...
  operator int() {...}
};
myClass myClassObject;

void func(int) {...}
func(myClassObject);

Polyspace 実装

チェッカーは、explicit 指定子が適用されていないユーザー定義の変換演算子の、宣言またはクラス内定義にフラグを設定します。

たとえば、operator int() {} は、現在のクラス型の変数を暗黙的と明示的の両方で int 変数に変換できますが、explicit operator int() {} は明示的変換しか実行できません。

トラブルシューティング

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

すべて展開する

#include <cstdint>

class MyClass {
public:
    explicit MyClass(int32_t arg): val(arg) {};
    operator int32_t() const { return val; }  //Noncompliant
    explicit operator bool() const {   //Compliant
        if (val>0) {
          return true;
        }
        return false;
     } 
private:
    int32_t val;
};

void useIntVal(int32_t);
void useBoolVal(bool);

void func() {
    MyClass MyClassObject{0};
    useIntVal(MyClassObject); 
    useBoolVal(static_cast<bool>(MyClassObject));
}

この例では、変換演算子 operator int32_t()explicit 指定子を使用して定義されておらず、ルールに違反しています。変換演算子 operator bool() は明示的に定義されており、ルールに違反していません。

useBoolVal の呼び出しなどで変数 bool に変換すると、変換演算子内のキーワード explicit によって、MyClass 型から bool 型への明示的変換を実行する必要があることが規定されます。変数 int32_t への変換にはこのような要件はありません。useIntVal の呼び出しでは、暗黙的変換が行われます。

チェック情報

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

バージョン履歴

R2020a で導入