ホームページ  >  記事  >  バックエンド開発  >  `std::function` がテンプレート引数の署名に曖昧さをもたらすのはなぜですか?

`std::function` がテンプレート引数の署名に曖昧さをもたらすのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 00:42:02965ブラウズ

Why Does `std::function` Lead to Ambiguity in Template Argument Signatures?

std::function テンプレートの引数署名のあいまいさ

あいまいさは、関数 の両方が存在する場合に発生します。および関数同じ関数から構築できます。 std::function は型消去に依存しているため、署名がテンプレート引数の署名と一致しない場合でも、任意の関数を受け入れることができます。

これを説明するには、次のクラスを考えてみましょう。

<code class="cpp">template<class Signature>
class myfunc{
public:
    template<class Func>
    myfunc(Func a_func){
        // ...
    }
};</code>

コンパイラは、オーバーロード セットに対して実行可能な関数を見つけようとするときに、潜在的な変換を検索します。この場合、myfunc の両方のコンストラクターは何でも受け入れ、 int(*)() から myfunc への変換を許可します。そして int(*)() から myfunc まで

したがって、a(x) または a(y) を呼び出すと、コンパイラーは 2 つの実行可能な関数に遭遇し、あいまいさが生じます。

解決策

std::function のテンプレート引数シグネチャは、関数を宣言および定義するときの型の一部です。ただし、オブジェクトの構築中、署名は無視されます。

曖昧さを回避するには、次のことができます。

  • 引数を目的の署名に明示的にキャストします (例: (function)(x)).
  • 適切な型の関数オブジェクトを作成し、それを渡します。
  • テンプレート メタプログラミング (TMP) を使用して署名を抽出し、自動的にキャストします。

以上が`std::function` がテンプレート引数の署名に曖昧さをもたらすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。