ホームページ > バックエンド開発 > C++ > C の初期化子リストでテンプレート推定が失敗するのはなぜですか?

C の初期化子リストでテンプレート推定が失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-29 16:39:09
オリジナル
646 人が閲覧しました

Why Does Template Deduction Fail with Initializer Lists in C  ?

テンプレート推論と初期化リスト

次の関数について考えてみましょう:

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 であると推論しますが、テンプレート引数は推論しません。これは、C 11 標準では、関数パラメーターが初期化子リストであるが、パラメーターに std::initializer_list または cv 修飾された可能性のある std への参照がない場合、これはテンプレート引数の非推定コンテキストであると明示的に記載されているためです。 ::initializer_list type.

それにもかかわらず、auto キーワードは特にサポートしていますstd::initializer_list<>、コードが正しく機能できるようにします。

以上がC の初期化子リストでテンプレート推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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