難問:
なぜ std::function なのか、最新の C コードベースの不可欠なコンポーネントですが、等価比較機能が備わっていませんか?この質問は、最初からプログラマーを当惑させており、呼び出し可能なオブジェクトのコレクションの管理に混乱と困難をもたらしています。
初期のあいまいさ:
C の初期ドラフト11 標準では、operator== および Operator!= のオーバーロードが宣言されましたが削除され、十分に説明されなかった空白が残されました。付随するコメント「型システムの可能性のある穴を塞ぐ」は隠れた欠陥を示唆していましたが、その性質は謎のままでした。
抜け穴と安全装置:
「抜け穴」の疑いは、ブール変換関数の存在に起因します。明示的な等価比較演算子がない場合、この関数では == または != を介した暗黙的な比較が可能です。ただし、次のように、この抜け穴は予期しない動作を引き起こす可能性があります。
struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b!
}
C 03 ではセーフ ブール イディオムが導入され、C 11 ではこの抜け穴を防ぐために明示的なブール変換関数が実装されました。
std::shared_ptr:[ とのコントラスト&&&]
std::function とは異なり、std::shared_ptr には明確に定義された等価性セマンティクスがあります。 2 つのポインタは、両方とも空である場合、または両方とも空ではなく同じオブジェクトを指している場合、等しいと見なされます。この明確な定義により、std::shared_ptr での等価比較演算子の実装が可能になりました。The Enigma Unraveled:
std::function の等価性を比較できない理由これは、任意の呼び出し可能型に対して意味のある等価基準を定義するという固有の課題から生じています。これを強制すると、すべての関数オブジェクトの実装者に負担がかかり、バインディング引数の違いによりあいまいな比較が生じる可能性があります。さらに、等価演算子が存在しないため、暗黙的な変換によって生じる抜け穴が事実上閉じられます。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3