1

長い型から小さな型への変換で警告が表示されることがあります。

void f( unsigned short i ) // f - accept any numeric type
                           // smaller than std::vector<>::size_type
{}

std::vector < some_type > v;
..
f ( v.size() );

通常、次のソリューションのいずれかを使用していました。

assert( v.size() <= std::numeric_limits< unsigned short >::max() );
f( static_cast< unsigned short >( v.size() ) );

また

f( boost::numeric_cast<  unsigned short >( v.size() ) );

しかし、私の現在の作業ではブーストは使用されておらず、先月からアサートは許可されていません。

この警告を抑制するために知っている他の安全な方法は何ですか?
説明された方法で落とし穴はありますか?

PS: f のシグネチャを常に変更できるとは限りません。また、小さな数値型を実際に受け入れる必要がある場合もあります。

編集済み: 変換をできるだけ安全にしたい。

4

4 に答える 4

7

そもそもなんでキャスト?通常、ベクトルのサイズは符号なし整数です。可能であれば、関数の署名を更新すると思います。警告は抑制されるものではなく、対処されるものです。

于 2009-04-04T13:05:44.297 に答える
3

これに対処する唯一の安全な方法は、実行時に変換が失われないようにすることです。アサートコードはデバッグビルド中にのみ機能し、リテールビルドでの変換損失を考慮に入れます。ベクトルのサイズが完全に正しくないため、変換損失は大きくなります。

本当に必要なのは、データの損失を防ぐためのメカニズムです。SafeIntのようなクラスを使用することをお勧めします。これにより、例外をスローすることによってオーバーフローまたはアンダーフローする変換が防止されます。

SafeInt<size_t> size = v.size();
f((unsigned short)size);  // Throws if size can't fit in an unsigned short

SafeInt: http: //www.codeplex.com/SafeInt

于 2009-04-04T13:27:01.127 に答える
2

ここでもう一度私のマントラを繰り返します。コードにキャストが含まれている場合は、コードまたはデザインに問題がある可能性があります。キャストを削除するために、両方を調べる必要があります。

ところで、あなたは私が最後に投稿したときにこれに賛成しました!

于 2009-04-04T13:13:33.717 に答える
2

size()は通常、符号なし整数を返すため、符号付き整数に型キャストするのは非常に安全です。

f(static_cast<expected-type>(v.size()));

それ以外の場合は、可能であれば関数のシグネチャを変更してください。

于 2009-04-04T13:14:53.527 に答える