C++ 安置吊舱

C++ 安置吊舱,c++,c++11,vector,emplace,C++,C++11,Vector,Emplace,可能重复: 吊舱是否可以安放?它在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': erro

可能重复:

吊舱是否可以安放?它在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);
}
struct X
{
INTA;
int b;
};
无效
{
std::向量xs;
X={1,2};
//好的
xs.推回(x);
//好的
xs.后侵位(x);
//错误C2661:'X::X':错误C2661:没有重载函数接受2个参数
xs.后侵位(1,2);
}

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

没有构造函数
X::X(int,int)
,这就是调用
emplace\u back
来构造
X
对象的方法。容器使用
allocator\u traits::construct(allocator,p,args)
来构造对象,其中
p
是指向某个分配空间的指针,
args
是传递给构造函数的参数。这是由
emplace\u back
使用的。这个
构造
函数调用
::new((void*)p)T(std::forward(args)…
,因此它不使用统一初始化


xs.emplace_back({1,2})
也将是一个错误,尽管可以使用列表初始化构造聚合。这是因为大括号内的初始值设定项列表无法转发。

它将其构建到位。没有这样的构造函数。我不认为它是决定性的,但是G++(4.7.1)也不接受它。我认为你可能必须有一个构造函数用于<代码> x>代码>,它有两个参数(如错误消息所建议的那样)。相关:用兼容的编译器工作很好,但不是用VC++ 2012(还)。(-)
emplace_-back({1,2})
是一个错误,
push_-back({1,2})
将工作。列表初始化不能在前者中进行,因为没有任何东西需要初始化(非正式地说),这是模板参数推断的一个必要缺点。@LucDanton谢谢,你说得对。