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

`std::function` のテンプレート引数がオーバーロードの解決に曖昧さをもたらすのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 03:45:02819ブラウズ

Why Does `std::function`'s Template Argument Lead to Ambiguity in Overload Resolution?

型を定義しているにもかかわらず、Std::Function のテンプレート引数に存在するあいまいさ

このシナリオでは、関数 'a' に複数のオーバーロードが存在します。 std::function:

  • function
  • function

の個別の署名を受け入れます。あいまいさは、両方の関数が異なるという事実により生じます。および関数同じ関数から構築可能です。 VS2010 で定義されている std::function コンストラクターでは、さまざまなソースからの構築が可能です。

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);

基本的に、あらゆるオブジェクトを std::function に変換でき、型の消去が容易になり、次のような処理が可能になります。

問題をさらに詳しく説明するために、次の単純化された例を考えてみましょう。

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

'a' のオーバーロード解決中に、実行可能なオーバーロードを識別できない場合、コンパイラはパラメーターのコンストラクターまたは引数の変換演算子のいずれかを使用して引数を変換しようとします。この場合、変換は myfunc のコンストラクターを介して行われます。

myfunc のコンストラクターは何でも受け入れるため、両方の functionおよび関数 myfunc に変換できます。

最終的に、これにより、コンパイラは 'a' のどのオーバーロードを呼び出すかを決定できなくなり、曖昧さが生じます。

Toこの問題を解決するには、いくつかのオプションがあります:

  1. 明示的なキャストの維持:
    明示的なキャストでは、コンパイラに必要なオーバーロードを指定できます: a((functionx))
  2. 関数オブジェクト:
    適切なタイプの関数オブジェクトを作成します: `function fx = x;
    関数 fy = y;`
  3. テンプレート メタプログラミング:
    正しい署名を取得するためにテンプレート メタプログラミングを使用します: `template
    struct get_signature{...};`

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

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