3

make_pairタイプを推測することはよく知られています。それが存在し、便利な理由です。次の例を参照してください。

std::pair <int,int> foo;
std::pair <int,int> bar;

foo = std::make_pair (10,20);
bar = std::make_pair (10.5,'A'); //ok: implicit conversion from pair<double,char>

ここで、上記の行で控除がいつ行われるかを正確に理解したいと思います。

bar = std::make_pair (10.5,'A');

ペアを作成し、それを割り当てている間、暗黙的にとにキャストdoubleしますか?intcharint

4

2 に答える 2

4

最初に、後でこのペアをどのタイプに割り当てても、渡したものとまったく同じタイプのペアを作成するstd::pair<double, char>ヘルパー関数の型推定に感謝します。std::make_pair

このオブジェクトは、テンプレートstd::pair<int,int>化された代入演算子のおかげで機能する に割り当てられます。この演算子は基本的に、(あなたの場合) aを anに、 aをanに内部的に割り当てる割り当て可能な型 ( to 、to ) を許可します。U1T1U2T2doubleintcharint

この言語には、式が使用される変数の型を「予測」する機能がありませんpair<int,int>。これは、間にこのステップを入れずにすぐに作成する必要があります。

そのステップを避けたい場合は、ペアを構築するときstd::make_pairに明示的にstd::pairする必要があります。ただし、最適化のおかげでパフォーマンスが向上するとは思えません。

于 2013-02-25T06:32:03.233 に答える
4

クリスのコメントを詳しく説明するには、これを見てください

bar = std::make_pair (10.5,'A');

と同じです

std::pair <double,char> myPair = std::make_pair (10.5,'A'); 
bar = myPair;

この最後の行では、以下の代入演算子を使用しています

template< class U1, class U2 >
pair& operator=( const pair<U1,U2>& other );

other.first を first に、other.second を second に割り当てます。

したがって、基になる型が割り当て可能である限り、任意の型のペアを相互に割り当てることができます。

于 2013-02-25T06:32:55.420 に答える