次の関数について考えてみましょう:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
この関数は begin()/end を持つ 1 つのパラメータを取ります() が有効なタイプ。ただし、次のコード スニペットは違法とみなされます:
printme({'a', 'b', 'c'});
ベクトル、文字列、配列、および明示的な初期化子リストを利用する同様のコードは問題なく動作します。なぜこの特定のスニペットが違法なのかという疑問が生じます。
この問題を理解する鍵は、テンプレート引数の推論にあります。この場合、テンプレート引数 T を推定することはできません。これを修正するには、以下に示すように、テンプレート引数を明示的に指定する必要があります。
printme<vector<char>>({'a', 'b', 'c'}) printme<initializer_list<char>>({'a', 'b', 'c'})
コードが正当である前述のスニペットでは、引数は明確に定義された型を持ち、テンプレート引数 T を許可します。シームレスに推論されるようになります。 auto を使用すると、型が std::initializer_list
ただし、テンプレート引数の推論と auto キーワードを比較すると、特有の動作が発生します。 auto は型を std::initializer_list
それにもかかわらず、auto キーワードは特にサポートしていますstd::initializer_list<>、コードが正しく機能できるようにします。
以上がC の初期化子リストでテンプレート推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。