キーワード explicit がありません
コンストラクターまたはユーザー定義変換演算子に指定子 explicit
がない
説明
この欠陥は、コンストラクターまたはユーザー定義変換演算子の宣言またはクラス内定義で指定子 explicit
が使用されていない場合に発生します。指定子 explicit
は、別のタイプの変数が現在のクラス タイプに暗黙的に変換されるのを防止します。
欠陥の適用対象は次のとおりです。
1 パラメーターのコンストラクター。
パラメーターが 1 つを除いてすべて既定値をもつコンストラクター。
たとえば、
MyClass::MyClass(float f, bool b=true){}
です。ユーザー定義変換演算子。
たとえば、
operator int() {}
は、現在のクラス型の変数をint
変数に変換します。
リスク
コンストラクターまたは変換演算子 explicit
を宣言しなかった場合は、コンパイラがクラス型との間で暗黙的で意図的ではない可能性がある型変換を実行し、予期せぬ結果が生じる可能性があります。
たとえば、クラス型のパラメーターを受け取る関数を他の型の引数で呼び出した場合は、コンストラクターを使用した暗黙的変換が行われる可能性があります。ここでの func
の呼び出しにより、int
型から myClass
型への暗黙的変換が行われます。
class myClass {}{ ... myClass(int) {...} }; void func(myClass); func(0);
ユーザー定義変換演算子を使用すると、逆暗黙的変換が行われる可能性があります。たとえば、引数としてクラス型を渡したが、関数のパラメーターが別の型だった場合です。ここでの func
の呼び出しにより、myClass
型から int
型への暗黙的変換が行われます。
class myClass {} { ... operator int() {...} }; myClass myClassObject; void func(int) {...} func(myClassObject);
修正方法
コードの可読性を高め、暗黙的変換を回避するために、コンストラクターまたは変換演算子の宣言またはクラス内定義で、コンストラクターまたは演算子の名前の前にキーワード explicit
を配置します。そうすれば、すべての暗黙的変換をコンパイル エラーとして検出し、明示的変換に変換することができます。
例
結果情報
グループ: オブジェクト指向 |
言語: C++ |
既定値: オフ |
コマンド ライン構文: MISSING_EXPLICIT_KEYWORD |
影響度: Low |
バージョン履歴
R2015b で導入