安置POD

fre*_*low 11 c++ vector pod c++11 emplace

可能重复:
vector <struct>上的C++ 11\templace_back?

是否有可能与POD进驻?它似乎在Visual Studio 2012中不起作用:

struct X
{
    int a;
    int b;
};

void whatever()
{
    std::vector<X> xs;
    X x = {1, 2};

    // okay
    xs.push_back(x);

    // okay
    xs.emplace_back(x);

    //error C2661: 'X::X': error C2661: no overloaded function takes 2 arguments
    xs.emplace_back(1, 2);
}
Run Code Online (Sandbox Code Playgroud)

这只是Visual Studio 2012的一个缺点,还是放置POD根本无法在C++ 11中运行?

Jos*_*eld 9

没有构造函数X::X(int,int),这是您调用emplace_back它来构造X对象的内容.容器用于allocator_traits<A>::construct(allocator, p, args)构造对象,其中p是指向某个已分配空间的指针,并且args是传递给构造函数的参数.这是用来的emplace_back.此construct函数调用::new((void*)p) T(std::forward<Args>(args)...),因此不使用统一初始化.

xs.emplace_back({1, 2})尽管可以使用列表初始化构建聚合,但也将是一个错误.那是因为无法转发大括号括起的初始化列表.

  • `emplace_back({1,2})`是一个错误,`push_back({1,2})`会起作用.列表初始化不能在前者中进行,因为没有什么可以初始化(非正式地说),它是模板参数推导的必要之恶. (4认同)