如何只对move-constructor进行一次调用?

时间:2013-03-09 17:42:56

标签: c++ c++11 move-semantics unique-ptr

如何使下面的代码只调用一次移动构造函数?

输出

MC
MC

CODE

#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然后删除它何时正确实施?

2 个答案:

答案 0 :(得分:7)

使用std::map::emplace

m.emplace(1, std::move(b));

答案 1 :(得分:4)

基本上使用emplace代替insert

m.emplace(1, std::move(b));