【问题标题】:How do I make only a single call to the move-constructor?如何只调用一次移动构造函数?
【发布时间】:2013-03-09 17:42:55
【问题描述】:

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

输出

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,然后在正确时将其删除实施了吗?

【问题讨论】:

  • map::emplace 似乎可以与gcc 4.8.0 一起使用,如果您不介意安装非发布版本的话。
  • @Praetorian +1 获取信息

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


【解决方案1】:

使用std::map::emplace:

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

【讨论】:

    【解决方案2】:

    基本上是使用emplace 而不是insert

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

    【讨论】:

    • ack - 我正在使用 gcc 4.7.2 - 是否有解决方法或我可以做些什么来预期它的实施?
    • 嗯...我想我收到了sandbox.cpp:27:4: error: ‘class std::map&lt;int, Bar&gt;’ has no member named ‘emplace’ - 可能我的安装有问题
    • @kfmfe04 奇怪,我也明白了;我可以发誓我已经用过了。
    • 不,没有简单的解决方法,这是标准要求此功能的原因之一。
    • FWIW,这适用于 clang(最新的 Apple Xcode 版本)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2021-08-06
    • 1970-01-01
    • 2019-07-27
    • 2016-12-21
    • 2012-10-19
    • 2013-12-11
    相关资源
    最近更新 更多