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 関数の場合:
その結果、コンパイラは、初期化リスト引数の場合、テンプレート引数 T を推定できません。テンプレート引数を明示的に指定すると、問題が解決されます (例: printme
auto の特別なケース
printme 関数では初期化子リスト引数は無効ですが、有効ですauto を使用して初期化子リストを保持する変数を初期化します。これは、auto が il の型を std::initializer_list
以上がこの例の「initializer_list」でテンプレート タイプの推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。