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中运行?
答案 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})
也将是一个错误。这是因为无法转发括号括起的初始化列表。