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谢谢,你说得对。