ホームページ >バックエンド開発 >C++ >C テンプレートの型推定において `printme({\'a\', \'b\', \'c\'});` が違法なのはなぜですか?

C テンプレートの型推定において `printme({\'a\', \'b\', \'c\'});` が違法なのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 20:24:14422ブラウズ

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

初期化子リストを使用した関数での型推定

関数テンプレートを検討します。

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

この関数は、begin を持つ型の 1 つのパラメーターを期待します。 () と end() function.

質問:

次の呼び出しはなぜ違法ですか?

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

答え:

printme({'a', 'b', 'c'}) の呼び出しは不正です。テンプレート引数 T は推論できません。テンプレート引数を明示的に指定しないと、begin() 関数と end() 関数を使用すると任意の型になる可能性があるため、コンパイラはパラメーターの型を決定できません。この問題は、次の場合には発生しません:

  • 明示的なテンプレート引数の指定: printme>({'a', 'b', 'c'})
  • 型推定によるパラメータ型: printme(std::vector({'a', 'b', 'c'}))
  • auto を使用して型を推定します: const auto il = {'a', 'b', 'c'}; printme(il);
  • テンプレート引数を明示的に指定: printme>({'a', 'b', 'c'})
  • これの例外は、auto の控除です。 std::initializer_list、テンプレート引数の推論とは異なります。この動作は C 11 標準 (§ 14.8.2.5/5) で明示的に指定されており、初期化子リストであるが std::initializer_list 型ではない関数パラメーターのテンプレート引数は推定されないことが規定されています。ただし、標準の § 7.1.6.4/6 では、std::initializer_list

    を推定するための auto の明示的なサポートが提供されています。

    以上がC テンプレートの型推定において `printme({\'a\', \'b\', \'c\'});` が違法なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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