ホームページ > バックエンド開発 > C++ > C 11 で明示的なテンプレート引数を使用すると `std::make_pair` が失敗するのはなぜですか?

C 11 で明示的なテンプレート引数を使用すると `std::make_pair` が失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-05 02:03:40
オリジナル
484 人が閲覧しました

Why Does `std::make_pair` Fail with Explicit Template Arguments in C  11?

謎を解く: 明示的なテンプレート パラメーターを使用した std::make_pair の難題

C の領域では、 std::make_pair 関数が便利な関数として注目を集めています。ペアを作成するためのツール。ただし、C 11 で明示的に指定されたテンプレート パラメーターを使用してこの関数を使用しようとすると、特有の問題が発生します。この記事では、この状況の背後にある謎めいた動作について詳しく説明します。

エラーが発生しています

次の点を考慮してください。予期されるコンパイルの代わりに、明示的なテンプレート引数を使用して文字列と整数のペアを作成しようとするコード スニペット:

std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
ログイン後にコピー

成功すると、次のような不可解なエラー メッセージが表示されます。

error: no matching function for call to 'make_pair(std::string&, int)'
ログイン後にコピー

謎を明らかにする

このエラーの原因は、std::make_pair の誤った使用にあります。この関数は、指定された引数に基づいてテンプレート パラメーターを推測するように設計されています。これらのパラメーターを明示的に指定すると、この推論プロセスが妨げられます。

内部構造

std::make_pair の C 11 実装は、型 T&& および U&& の 2 つのパラメーターを受け取ります。ここで、T と U はテンプレート型パラメーターです。 。問題のあるコードに見られるように、テンプレート引数を明示的に指定すると、引数の推定は行われません。代わりに、指定された型がテンプレート宣言に直接置換され、次のようになります。

make_pair(std::string&& argT, int&& argU);
ログイン後にコピー

右辺値参照の重要な役割

明示的に指定されたテンプレート内のパラメータは両方とも右辺値であることに注意してください。参照 (&&)。右辺値式にのみバインドできます。提供されたコードでは、 s は左辺値です (一時的なものではなく、移動されません)。その結果、関数テンプレートは引数と一致せず、コンパイル エラーが発生します。

明示的な引数なしで機能する理由

明示的なテンプレート引数を省略すると、引数の推定が行われます。テンプレート内の右辺値参照パラメーターの特殊な性質 (参照の折りたたみ) により、型 A&& の右辺値参照パラメーター (A はテンプレート型パラメーター) は、任意の型の A にバインドできます。A が左辺値、右辺値、修飾された値、またはそうではなく、A&& はそれにバインドできます。

コード例では、s は std::string 型の左辺値、7 は int 型の右辺値です。コンパイラーは、T が std::string& であり、U が int であると推定し、s と 7 が推測されたパラメーターの型に正常にバインドできるようにします。

結論

このようなエラーを回避するには、次の手順に従ってください。次の原則: 関数の引数からテンプレート引数を推定できる場合は、コンパイラに推定の実行を許可します。引数を明示的に指定することは多くの場合不必要であり、予期しない結果につながる可能性があります。引数演繹の力を利用することにより、プログラマはコードを簡素化し、正確さを維持しながら可読性を高めることができます。

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

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