2011-10-10 16 views
5

私が作業しているプロジェクトのソースコードでPCLintを実行したとき、この例が見つかりました。コードスニペットは次のとおりです。これはなぜコンパイルされ、コンパイラがエラーまたは警告として報告することができるコンパイラスイッチがありますか?

QString foo() 
{ 
    return false; 
} 

コードをコンパイルし、空の文字列を返すことを確認しました。 、枝があった場合、実際の例では、一部のリモートのどこかに大きなクラスの大規模な方法であり、この孤立

return false; 

[OK]を、それは私ができるSVN /非難を使用することにより、開発者に悪いコーディング、恥を(あります誰がこれをしたのかを知ることさえできます:-))、真剣に言えば、コンパイラーはなぜ不平を言っていませんか?

私の理論は、コンパイラがしかし、私はこれを推測するために、コンパイラによって実行される全ての基本手順が表示されない

return QString(((const char *) false)); 

return false; 

を変換することです。最初にQStringのすべてのコンストラクタを試してみると、

QString(const * char); 

ですが、それでは? boolからconst char *へ行くことができるかどうかはどのように決定しますか?または、ポインタが期待されるブールを使用するたびに自動的にブールを任意のポインタ型にキャストしますか?

質問の第2部分です。これらの暗黙の型変換はすべて非常に危険です(なぜ、開発者は「空の文字列を返す」ことを意味する場合、「偽を返しますか?」)、そのような状況が少なくとも報告されるような方法(コンパイラスイッチなど)警告として?私はg ++を試しましたが、警告は表示されませんでした。ヒントのための

EDIT

感謝。偽は特別な扱いをしているようです。私は

return true; 

をすれば私が取得:私はUbuntuの上でG ++ 4.4.3を使用しています

error: conversion from ‘bool’ to non-scalar type ‘QString’ requested 

。異なるコメントで指摘されているように、他のコンパイラが問題を報告します。

+0

clangはこれについて警告していますが、これはしばらく前のことでした。 – Dani

+0

GCC(少なくとも4.5)**は警告します**。 – Mat

+4

ここに '明示的な 'コンストラクタのプラグを挿入します。 –

答えて

7

falseはゼロに等しい。ゼロはNULLポインタを表す特殊なケースであり、警告なしで任意のポインタ型にキャストされます。

私は、コンパイラは、ワンステップ変換として、これを許可し、booleanからintに2段階の変換を検討していなかった、そしてintchar*にいることは非常に驚いている - 二段階の変換が行われていません暗黙のうちに。

+0

しかし、falseはbool型を持ち、0はint型です。キャストは自動的に実行されますか? – Giorgio

+0

GCCは警告します: '警告: 'QString :: QString(const char *)'の引数1のポインタ型に 'false'を変換します。 – Mat

+0

奇妙なことに、私は警告を受け取りません。 g ++(Ubuntu 4.4.3-4ubuntu5)の使用4.4.3。私はコマンドライン上にある。 – Giorgio

関連する問題