警告 C26475
関数の C スタイルのキャストは使用しないでください。
C++ Core Guidelines: ES.49: キャストを使用する必要がある場合は、名前付きキャストを使用します
関数スタイルのキャスト (たとえば) は、 int(1.1)
安全性に疑問を持つ C スタイルのキャスト (たとえば (int)1.1
) のもう 1 つの形式です。 具体的には、C キャストまたは関数キャストでデータ損失が発生する可能性がある場合、コンパイラはチェックを試みません。 どちらの場合も、キャストを避けるか、可能な場合はブレース初期化子を使用することをお勧めします。 どちらも機能しない場合は、静的キャストが適している可能性がありますが、ガイドライン サポート ライブラリのユーティリティを使用することをお勧めします。
gsl::narrow
は無損失変換を保証し、不可能な場合はスローしますgsl::narrowing_error
。gsl::narrow_cast
変換によってデータが失われる可能性があり、許容できることを明確に示しています。
解説
この規則は、プリミティブ型の定数に対してのみ適用されます。 このような場合、コンパイラはデータ損失を明確に検出し、かっこで固定された初期化子を使用するとエラーを生成します。 実行時の実行が必要な場合は、C26493 NO_CSTYLE_CASTによってフラグが設定されます。
既定の初期化子にはフラグが設定されていません (たとえば
int()
)。
例
危険な変換の例:
constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475
潜在的なデータ損失を検出する、危険な変換のコンパイラ エラー:
constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397
危険な変換を修正するには、適切なサイズのプリミティブ型を使用します。
constexpr auto planck_constant = double{ 6.62607004082e-34 };