std::function は等価で比較できないのはなぜですか?
std::function は広く使用されているにもかかわらず、等価で比較できません。この制限は、boost::function および std::tr1::function にも当てはまりますが、その根源は言語設計上の考慮事項にあります。
元々削除された演算子
初期の C 11 ドラフトでは、std::function の等価演算子が削除済みとして宣言され、「削除されたオーバーロードにより型システムの潜在的な穴が塞がれる」というコメントが付けられていました。この曖昧な記述により、この「穴」の性質について疑問が残ります。
ブール型変換の「抜け穴」
TR1 仕様によれば、宣言されていない等価性はstd::function の演算子は、ブール型の変換によって作成された抜け穴を閉じることを目的としています。これらの変換により、== と != を介して関数インスタンスを比較できるようになります。
std::shared_ptr 例外
std::function とは異なり、std::shared_ptr には次のような特徴があります。明確に定義された等価セマンティクス。 2 つのポインターが両方とも空であるか、両方とも空でなく同じオブジェクトを指している場合、それらは等しいとみなされます。これは、std::shared_ptr の役割がより単純であり、その等価性セマンティクスを簡単に定義できるためです。
複雑性と等価性
std::function の等価性比較を実装すると、次のようになります。すべての呼び出し可能な型が等価比較可能である必要がありますが、これは常に実現可能であるとは限りません。さらに、関数の等価性のテストは、特に引数バインディングが異なる場合に困難になる可能性があります。
結論
一方、 std::function はさまざまな関数を操作する便利な方法を提供します。呼び出し可能な型では、等価性の比較ができないため、意図的に設計上の選択が行われています。この決定の背後には、潜在的な抜け穴を回避し、呼び出し可能型の多様な性質に対応することが主な考慮事項でした。
以上がstd::function が等価比較できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。