安置POD

时间:2012-12-19 22:06:04

标签: c++ c++11 vector pod emplace

  

可能重复:
  C++11 emplace_back on vector<struct>?

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);
}

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

1 个答案:

答案 0 :(得分:8)

没有构造函数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})也将是一个错误。这是因为无法转发括号括起的初始化列表。