コードはひどく複雑です。実際には、getAssigmentメソッドが成功したかどうか、および割り当てられたポインターがnullでないかどうかをテストする必要があります。
このコードは、複雑な方法ではありますが、明示性とC ++の強い型付けを採用しようとするのではなく、弱い型付けを利用してテストします。結果として、それは慣用的なC ++ではなく、必要以上に理解するのが難しいです。
!!a特に、 C++では使用しないでください。これは、JavaScriptなどの弱い型の言語で確立されたイディオムであり、値をブール型に強制変換します。しかし、C ++では、これは一般的に使用されていません。
hasSolution定義または使用されていないため、コードが何をするのかは明確ではありません。ただし、コードは次のコードと同等であると思われます。
Assignment *a;
return getAssignment(query, a) and a == nullptr;
0(C ++ 11より前では、代わりに書く必要がありますnullptr。)
ただし、このコードは依然として悪い設計を示しています。なぜa参照によって渡されるのでしょうか。なぜそれは戻り値ではないのですか?さらに悪いことに、a使用されることはないので、不要です。a本当に不要な場合は、完全に除外する必要があります。必要な場合は、戻り値にする必要があります。つまり、のプロトタイプはgetAssignment次のようになります。
Assignment* getAssignment(the_type_of_query query);
そしてそれは単に次のように使用されるべきです:
Assignment* a = getAssignment(query);
さらに、このコードは実際にメモリの所有権をrawポインタに割り当てているのではないかと思いますa。これは、最新のC++では強く推奨されていません。ポインタを使用しないか、スマートポインタを使用してください。