14

可能重复:
vector<struct> 上的 C++11 emplace_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);
}

这只是 Visual Studio 2012 的一个缺点,还是在 C++11 中放置 POD 根本不起作用?

4

1 回答 1

13

没有构造函数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})也将是一个错误,尽管可以使用列表初始化构造聚合。这是因为大括号括起来的初始值设定项列表不能被转发。

于 2012-12-19T22:13:28.173 回答