2

以下のコードで move-constructorを 1 回だけ呼び出すにはどうすればよいですか?

出力

MC
MC

コード

#include <vector>
#include <map>
#include <memory>
#include <iostream>

struct Bar
{
        Bar() { }
        Bar( Bar&& rhs )
        {
                std::cerr << "MC\n";

                for( auto& p : rhs.m_v )
                {
                        std::cerr << "inside loop\n";
                        m_v.push_back( move( p ));
                }
        }
        std::vector< std::unique_ptr< Bar >>  m_v;
};

int main()
{
        Bar b;

        std::map<int,Bar> m;
        m.insert( std::make_pair( 1, std::move( b )));
}

編集

正しい答えのように見えますemplaceが、残念ながら、gcc 4.7.2 にはまだありません... ...これをエイリアスにしてinsert、適切に実装されたときに削除する方法はありますか?

4

2 に答える 2

7

使用std::map::emplace:

m.emplace(1, std::move(b));
于 2013-03-09T17:45:16.667 に答える
4

本質的にemplace代わりに使用することによりinsert

m.emplace(1, std::move(b));
于 2013-03-09T17:45:15.973 に答える