std::function テンプレートを使用する場合、あいまいさ考えられる複数の過負荷が原因で発生する可能性があります。具体的には、次のコード スニペットを検討してください:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
このあいまいさは、function
std::function のテンプレート引数の署名は、宣言および定義中にその型の一部とみなされます。ただし、オブジェクトの構築中はこの限りではありません。
std::function は、C の多くの関数オブジェクトと同様に、型消去と呼ばれる手法を使用します。これにより、呼び出されたときに予期される署名を満たす限り、任意のオブジェクトまたは関数を受け入れることができます。欠点は、署名の不一致に関連するエラーがコンストラクター レベルではなく、実装の奥深くで発生することです。
この曖昧さを回避するには、主に 3 つのオプションがあります:
std::function のテンプレート引数は、宣言と定義中にその型を決定しますが、オブジェクトの構築では何の役割も果たしません。これにより、コンストラクターが任意の引数を受け入れるときにあいまいさが生じる可能性があります。これを解決するには、プログラマは明示的な型キャスト、関数オブジェクトのラッピング、または TMP.
を使用できます。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3