2011-10-27 2 views
2

これは私のテストケース(WTFのコメントに注意してください)です。文字列に整数値が割り当てられていることをgccに警告する方法を教えてください。

TEST(string_assignment) 
{ 
std::string str; 
std::string cheese="Cheese"; 
str=cheese; 
CHECK_EQUAL(cheese, str); 

long lval=0; 
str=lval; //WTF - why does the compiler allow this ? 

str=""; 
str.append(cheese); 
CHECK_EQUAL(cheese, str); 
} 

私がのstd ::文字列のインスタンスをキャッチしたいが、別の文字列またはchar *以外の何かが割り当てられています。私はコンパイラが互換性のない型を拒否すると仮定していましたが、それは許しています。

gcc(バージョン4.4.3)にこの愚かさを拒否させるにはどうすればよいですか? ...またはstd :: stringに割り当てられているこれらの互換性のない型を強制的に拒否する別の方法がありますか?

+0

@ 0A0D:ここでも違いはありません。 –

+0

申し訳ありませんが、**文字列に整数を割り当てない**はどうですか?これは本当にあなたができ、C++での実行を妨げていない最も悪いことではありません。 –

+0

@Christian Rau - メインプロジェクトの変数のタイプを変更したため、テストケースに追加しました。コンパイル時に非常に驚いていました(はい、変数使用をブックマークするコンパイラを使用しています) – user1016736

答えて

5

理由は以下の過負荷が存在することである:

string &operator=(char) 

コンパイラは、単一の暗黙の型変換を使用して割り当てを満たすことができるので、コンパイルします。

私は-Wconversion GCCフラグはこれに対処すると思われますが、少なくともGCC 4.1.2では動作していないようです。

+1

+1あなたはそれについての質問に答えることができます。私は好奇心が強いでしょう。 –

+0

実際、クラスを実装してコンパイル時エラーになると思います。コンパイルされないテンプレートの 'operator ='を提供するだけです。しかし、それは標準に準拠していません。法的プログラムは 'long x = 'x'のようなことをすることができます。 someString = x; '。 –

+0

-Wconversionを使用すると、警告が表示されます。 'int'から 'char'への変換はその値を変更する可能性があります。私はこれを試して、明示的なキャストで報告する他の問題を修正します。 – user1016736

3

できません。結局のところ、C互換のため、longは他の組み込みの数値型と同様に暗黙的にcharに変換されます。したがって、これを禁止するには、someString = someCharも禁止する必要があります。どんな理由であれ、委員会は必要だと感じました。

3

それは次の理由過負荷のコンパイル:

string& operator=(char) 

使用g++ -Wconversion警告メッセージを印刷するために。

およびg++ -Wconversion -Werror警告をエラーとして処理します。

+1

あなたが実際に質問に答えたので、+ 1 :-)。それが不平を言っていない理由だけでなく、苦情を受ける方法。 (これは他の苦情も発生させますが、そのほとんどは正当化されます) –

+1

ニース - o -Wconversionと-Werrorを追加すると他の課題もチェックされます! – user1016736

+0

@ user1016736:すべての警告フラグを有効にすることをお勧めします。私はほとんど常に '-Wall'を使いますが、残念ながら' -Wconversion'は含まれていないので手動で含める必要があります。 – Nawaz

関連する問題