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

C の「initializer_list」でテンプレート型推定が失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-12-05 01:52:09
オリジナル
192 人が閲覧しました

Why Does Template Type Deduction Fail with `initializer_list` in C  ?

initializer_list とテンプレートの型推論

テンプレートの型推論は、コンパイラが、コンパイラに渡された引数からテンプレートの型引数を推論できるようにする 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ただし、テンプレート引数はそうではありません。これは、C 11 標準の § 14.8.2.5/5 で、これがテンプレート引数の非推定コンテキストであると明示的に述べられているためです。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート