ホームページ >バックエンド開発 >C++ >C 11 の `std::make_pair` でテンプレート パラメータを明示的に指定するとコンパイルに失敗するのはなぜですか?

C 11 の `std::make_pair` でテンプレート パラメータを明示的に指定するとコンパイルに失敗するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-01 12:49:111019ブラウズ

Why Does Explicitly Specifying Template Parameters in C  11's `std::make_pair` Fail to Compile?

指定されたテンプレート パラメーターを使用した C 11 make_pair のコンパイルに失敗します

Q:

g 4.7 で C 11 を使用しているとき、 std::make_pair 関数を明示的に使用してコードをコンパイルしようとする試み指定されたテンプレートパラメータは失敗します。このエラーの原因を理解することが目的です。

A:

make_pair の間違った使用法

std::make_pairテンプレート引数の自動推論を目的としています。テンプレート パラメーターを明示的に指定すると、この演繹が防止され、実際の引数の型と予期される引数の型の間に不一致が生じます。この関数は型 T&& および U&& の引数を受け取ります。ここで、T と U はテンプレート型パラメーターであり、事実上次のようになります。

template<typename T, typename U>
make_pair(T&& argT, U&& argU);

引数の型の不一致

テンプレート パラメーターを指定する場合明示的に、引数の演繹は行われません。代わりに、指定された型が関数テンプレートで直接使用され、次のようになります。

make_pair(std::string&& argT, int&& argU);

この場合、両方のパラメーターの型は右辺値参照であり、右辺値にのみバインドできます。ただし、引数の 1 つ s は左辺値 (既存のオブジェクト) であるため、予期される右辺値参照型と互換性がありません。したがって、関数テンプレートは指定された引数と一致せず、コンパイル エラーが発生します。

make_pair の正しい使用法

この問題を解決するには、明示的なテンプレート パラメーターの指定を削除してください。自動引数推定を許可します。このシナリオでは、s が std::string 型の左辺値であるため、コンパイラーは T が std::string であると推定でき、最終引数の型として std::string& が得られます。同様に、U は int であると推定され、引数 7 は int 型の右辺値となり、int&& となります。これらの引数の型は関数テンプレートと正しく一致するため、コンパイルを成功させることができます。

テンプレートの一般ガイドライン

テンプレートの場合、通常、コンパイラにテンプレート引数の推論を実行させることをお勧めします。可能な限り。テンプレート パラメーターの明示的な指定は、絶対に必要な場合にのみ実行してください。

以上がC 11 の `std::make_pair` でテンプレート パラメータを明示的に指定するとコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。