これは密接に関連しています C++ 列挙型は署名されていますか、または署名されていませんか? . JavaMan の回答によると、 anenum
はどちらsigned
でもありませんunsigned
。しかし、それは不可欠な昇格規則に従います。
私はライブラリを使用して作業しており、それらを使用enums
して、ほとんどunsigned
のタイプを期待する他のクラス オブジェクトに渡します (unsigned int
や などsize_t
)。-Wsign-conversion
正当な間違いを見つけようとして警告を有効にすると、言語のルールが原因で多数の誤検知が発生します。
ルールのようなものは、型の安全性を確保し、一般的な間違いを見つけるのが難しい状況を生み出します。static_cast
コード全体に散らばるようなものは避けたいので難しいです。
enums
具体的なsigned
または型に昇格するための言語の既定の動作をオーバーライドする方法はありますunsigned
か? char
( is signed または unsignedを指定する方法と同様です)。
関連して、このライブラリは 1990 年代に作成されたため、多くの古いコンパイラをサポートしています。解決策が C++03 に対応し、場合によってはそれ以前にも対処できれば素晴らしいことです。
C++03およびC++11の移動コンストラクターを保護する方法から? 、実際には、他の C++ 言語バリアントが有効になっていることを検出する信頼できる方法がないことはわかっています。-std=c++03
と を使用した Clang 3.5 でのテスト中に、顔が平らになり-std=c++11
ました。