明白な答えは次のとおりです。それはエラーではないからです。falseの場合、および呼び出し元が戻り値を使用する場合はエラーに
x
なりますが、少なくとも一般的なケースでは、どちらもコンパイラーが必ずしも決定することはできません。
return
この特定のケース(ポインターを返す)では、すべてのパスにを要求することはそれほど難しくありません。Javaはこれを行います。ただし、一般に、C ++ではこれを要求するのは合理的ではありません。C++では、値を作成できない(デフォルトのコンストラクターがないなど)ユーザー定義型を返すことができるため、プログラマーが取得できないことがわかっているブランチでを提供できない可能性がreturn
あり、コンパイラはブランチを取得できないと判断できません。
ほとんどのコンパイラは、フローを決定できるときに、そのような場合に警告します。しかし、私が見たものはすべて、最後から抜け出すことが明らかに不可能な場合にも警告を発します。(g++とVC++の両方が警告します:
int
bar( char ch )
{
switch ( ch & 0xC0 ) {
case 0x00:
case 0x40:
return 0;
case 0x80:
return -1;
case 0xC0:
return 1;
}
}
、少なくとも通常のオプションでは。この関数が決して終わりから外れないことは非常に明白ですが。)