メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2008 Rule 12-1-3

All constructors that are callable with a single argument of fundamental type shall be declared explicit.

説明

ルール定義

All constructors that are callable with a single argument of fundamental type shall be declared explicit. 1

根拠

基本型の単一の引数で呼び出し可能なクラス コンストラクターは、コンパイラによって誤って呼び出され、基本型の変数がクラスに変換される可能性があります。このような暗黙的変換が予期しない場所で発生し、予期しない動作を引き起こす可能性があります。基本型の単一の引数で呼び出し可能なコンストラクターは、explicit として明示的に宣言してください。

Polyspace 実装

Polyspace® は、コンストラクターが以下のすべての条件を満たす場合にこのルールの違反を報告します。

  • コンストラクターで単一の引数、または既定の初期化が施されない 1 つの引数が使用されている。

  • 単一の引数または既定の初期化が施されない引数が、整数型、浮動小数点型、void 型などの基本型である。

  • コンストラクターが explicit として宣言されていない。

トラブルシューティング

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

すべて展開する

この例では、クラス MyClass で単一の整数引数で呼び出し可能なコンストラクターが使用されています。関数 foo() 内での func() の呼び出しにより、整数 5MyClass タイプのオブジェクトに変換されます。このような暗黙的変換は予期しない結果を引き起こす可能性があります。Polyspace は違反を報告します。

#include <iostream>

class MyClass {
public:
	MyClass(int x) : value(x) { //Noncompliant
		std::cout << "Constructor called with value: " << value << std::endl;
	}

private:
	int value;
};

void func(MyClass obj) {
	std::cout << "Function called with MyClass object." << std::endl;
}

void foo() {
	func(5); // Implicit conversion from int to MyClass
	//...
}

チェック情報

グループ: Special Member Functions
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.