2016-05-26 5 views
1

に据え付ける動きます。メソッドemplacestd::pairを構成し、std::mapに移動します(コピーは必要ありません)。しかし、intのコピーは左辺値ですが、std::stringのコピーは右辺値にキャストされるため、どのコンストラクタがstd::pairを構築するために呼び出されますか? 1つの引数は移動できないので、ここで追加のコピーが行われると思います。そうですか?明らかに、私もintのコピーを右辺値にキャストすれば、私は追加のコピーがないと思います。地図は、私は私が正しく、このコードを理解すればわからない左辺値

答えて

4

このコンストラクタが呼び出されます。この場合xy

template< class U1, class U2 > 
pair(U1&& x, U2&& y); 

は右辺値参照が、普遍の参照ではありません。長い短編小説では、左辺値(この場合はint)は左辺値参照と右辺値(この場合はstd::string)から右辺値参照に崩れます(std::move())。

にインスタンスコンストラクタは次のようになります。

pair(int& x, std::string&& y); 

スコット・マイヤーズがaddが呼び出されるとhttps://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers

+0

'std :: pair'は' int'をコピーし、 'std :: string'を右に動かすように構成されていますか? –

+0

@MarcoAgnese correct – imreal

0

は、std::stringintがコピーされている多くの良いことを説明しています。

intがコピーされますが、最初にコピーするstd::stringはありません。その代わり、sはあなたが渡していることを文字列リテラルから関数自体にその場で構成されている。

ので、私たちは、ミックスと一致させることができますstd::pair

を構築するために呼び出されるコンストラクタ。 std::pairの転送参照のコンストラクタテンプレートがあります:

template< class U1, class U2 > 
pair(U1&& x, U2&& y);   // since C++11, until C++14 

template< class U1, class U2 > 
constexpr pair(U1&& x, U2&& y); // since C++14 

したがって、この場合には、我々はpair<int&, std::string>を呼んでいます。 「追加コピー」はありません。

関連する問題