This question already has answers here:
std::map emplace without copying value
                                
                                    (2个答案)
                                
                        
                                2年前关闭。
            
                    
struct Foo {
    Foo(int a, int b) : a_(a), b_(b) {}
    int a_;
    int b_;
};

int main()
{
    vector<Foo> vec;
    vec.emplace_back(1, 2);
}


上面的代码可以编译,因为emplace_back可以就地构造Foo对象。

int main()
{
    map<int, Foo> m;
    m.emplace(1, 2, 3);
}


上面的代码无法编译。为什么emplace不使用args Foo2在原位构造3?如果Foo构造函数具有1 arg,则上述样式有效。

我正在使用gcc 4.9.2,这不是最新的。有人认为上面的代码可以在以后的编译器中编译吗?

最佳答案

您的value_typemapstd::pair<const int, Foo>pair没有带三个int参数的constructor

你可以做

m.emplace(1, Foo(2, 3));


或者,如果您真的不想调用Foo的move构造函数,

m.emplace(std::piecewise_construct,
          std::make_tuple(1),
          std::make_tuple(2, 3));

关于c++ - C++ Map Emplace ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43507605/

10-09 06:34