テンプレートの型推論は、コンパイラが、コンパイラに渡された引数からテンプレートの型引数を推論できるようにする C の強力な機能です。テンプレート。ただし、場合によっては、コンパイラが型引数を推定できないため、必要な型引数を使用してテンプレートを明示的にインスタンス化する必要があります。
次の関数について考えてみましょう。
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
This関数は、begin()/end() が有効な型の単一パラメータを期待します。問題は、次のコードがなぜ違法なのかということです。
printme({'a', 'b', 'c'});
これらがすべて正当である場合:
printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'});
次のように書くこともできます:
const auto il = {'a', 'b', 'c'}; printme(il);
または:
printme<std::initializer_list<char>>({'a', 'b', 'c'});
テンプレート引数 T を指定できないため、コードの最初の行は不正です。推測される。テンプレート引数が明示的に指定されている場合、それは機能します。例:
printme<std::vector<char>>({'a', 'b', 'c'})
または:
printme<std::initializer_list<char>>({'a', 'b', 'c'})
引数には明確に定義された型があるため、コードの他の行は有効です。したがって、テンプレート引数 T は問題なく推定できます。
混乱するかもしれない部分は、auto が型を選択することです。 std::initializer_list
A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.
ただし、auto の場合、§ 7.1.6.4/6 ではstd::initializer_list<>:
if the initializer is a braced-init-list (8.5.4), with std::initializer_list<U>.
以上がC の「initializer_list」でテンプレート型推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。