ホームページ >バックエンド開発 >C++ >この例の「initializer_list」でテンプレート タイプの推定が失敗するのはなぜですか?

この例の「initializer_list」でテンプレート タイプの推定が失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-28 18:47:11698ブラウズ

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

initializer_list によるテンプレート型推定

次の関数を考えてみましょう:

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}

上記の関数は単一のパラメーターを必要としますbegin() および end() メンバー関数を使用します。さまざまなデータ型を使用してこの関数を呼び出す方法はいくつかあります。たとえば、std::vector、std::string、std::array、さらには初期化子リストも使用できます。ただし、不正なケースが 1 つあります。

printme({'a', 'b', 'c'});

このコード行はコンパイル時エラーになります。なぜそうなるのですか?

テンプレート引数推定の失敗

テンプレート引数の型推定は、関数のパラメーターの型が指定された引数の型と一致する場合にのみ成功します。 printme 関数の場合:

  • std::vector、std::string、および std::array 引数はすべて、関数のパラメーターの型に対応する明確に定義された型を持ちます (例: std::vector).
  • 初期化リスト引数 ({'a', 'b', 'c'}) には明確に定義された型がありません。これは、特定の型に関連付けられていない一時オブジェクトです。
  • その結果、コンパイラは、初期化リスト引数の場合、テンプレート引数 T を推定できません。テンプレート引数を明示的に指定すると、問題が解決されます (例: printme>({'a', 'b', 'c'}))。

    auto の特別なケース

    printme 関数では初期化子リスト引数は無効ですが、有効ですauto を使用して初期化子リストを保持する変数を初期化します。これは、auto が il の型を std::initializer_list として推定し、コンパイラが printme(il) のテンプレート引数を推定できるようにするためです。

    以上がこの例の「initializer_list」でテンプレート タイプの推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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