std::function テンプレートを使用する場合、あいまいさ考えられる複数の過負荷が原因で発生する可能性があります。具体的には、次のコード スニペットを考えてみましょう。
<code class="cpp">#include <functional> using namespace std; int a(const function<int()>& f) { return f(); } int a(const function<int(int)>& 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. }</code>
このあいまいさは、両方の関数が
std::function のテンプレート引数の署名は、宣言および定義中にその型の一部とみなされます。ただし、オブジェクトの構築中はこの限りではありません。
std::function は、C の多くの関数オブジェクトと同様に、型消去と呼ばれる手法を使用します。これにより、呼び出されたときに予期される署名を満たす限り、任意のオブジェクトまたは関数を受け入れることができます。欠点は、署名の不一致に関連するエラーがコンストラクター レベルではなく、実装の奥深くで発生することです。
この曖昧さを回避するには、次の 3 つの主要なオプションが存在します。
std::function のテンプレート引数は、宣言と定義中にその型を決定しますが、オブジェクトの構築には何の役割も果たしません。これにより、コンストラクターが任意の引数を受け入れるときにあいまいさが生じる可能性があります。これを解決するには、プログラマは明示的な型キャスト、関数オブジェクトのラッピング、または TMP を使用できます。
以上が`std::function` のテンプレート引数は、オブジェクトの構築中にその型に影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。