難問:
なぜ std::function なのか、最新の C コードベースの不可欠なコンポーネントですが、等価比較機能が備わっていませんか?この疑問は、最初からプログラマーを当惑させ、呼び出し可能なオブジェクトのコレクションの管理に混乱と困難をもたらしてきました。
初期のあいまいさ:
C の初期のドラフトでは11 標準では、operator== および Operator!= のオーバーロードが宣言されましたが削除され、十分に説明されなかった空白が残されました。付随するコメント「型システムの可能性のある穴を塞ぐ」は隠れた欠陥を示唆していましたが、その性質は謎のままでした。
抜け穴と安全装置:
「抜け穴」の疑いがあるのは、ブール変換関数の存在にあります。明示的な等価比較演算子がない場合、この関数では == または != を介した暗黙的な比較が可能です。ただし、
<code class="cpp">struct S { operator bool() { return false; } }; int main() { S a, b; bool are_equal(a == b); // Uses operator bool on a and b! }</code>
C 03 では、safe-bool イディオムが導入され、C 11 では、この抜け穴を防ぐために明示的な bool 変換関数が実装されました。
で示されているように、この抜け穴は予期しない動作を引き起こす可能性があります。
std::shared_ptr との対比:
std::function とは異なり、std::shared_ptr には明確に定義された等価性セマンティクスがあります。 2 つのポインタは、両方とも空である場合、または両方とも空ではなく同じオブジェクトを指している場合、等しいと見なされます。この明確な定義により、std::shared_ptr での等価比較演算子の実装が可能になりました。
解明された謎:
std::function の等価性を比較できない理由これは、任意の呼び出し可能型に対して意味のある等価基準を定義するという固有の課題から生じています。これを強制すると、すべての関数オブジェクトの実装者に負担がかかり、バインディング引数の違いによりあいまいな比較が生じる可能性があります。さらに、等価演算子が存在しないため、暗黙的な変換によって生じる抜け穴が事実上閉じられます。以上がなぜ `std::function` には等価比較がないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。