C++11向量具有新的函数emplace_back
。与依赖编译器优化来避免复制的push_back
不同,emplace_back
使用完美转发将参数直接发送到构造函数,从而就地创建对象。在我看来,emplace_back
做了push_back
能做的所有事情,但有时它会做得更好(但从未变得更糟)。
我必须使用push_back
的原因是什么
发布于 2012-06-05 10:12:26
push_back
总是允许使用统一初始化,这是我非常喜欢的。例如:
struct aggregate {
int foo;
int bar;
};
std::vector<aggregate> v;
v.push_back({ 42, 121 });
另一方面,v.emplace_back({ 42, 121 });
将无法工作。
发布于 2012-06-05 10:03:21
向后兼容C++11之前的编译器。
发布于 2015-02-10 23:35:59
emplace_back的一些库实现不符合C++标准中指定的行为,包括Visual Studio2012、2013和2015附带的版本。
为了适应已知的编译器错误,如果参数引用迭代器或其他在调用后将无效的对象,则首选使用std::vector::push_back()
。
std::vector<int> v;
v.emplace_back(123);
v.emplace_back(v[0]); // Produces incorrect results in some compilers
在一个编译器上,v包含值123和21,而不是预期的123和123。这是因为第二次调用emplace_back
会导致调整大小,此时v[0]
将变得无效。
上述代码的有效实现将使用push_back()
而不是emplace_back()
,如下所示:
std::vector<int> v;
v.emplace_back(123);
v.push_back(v[0]);
注意:使用整数向量是为了演示目的。我在一个更复杂的类中发现了这个问题,该类包含动态分配的成员变量,对emplace_back()
的调用导致了硬崩溃。
https://stackoverflow.com/questions/10890653
复制相似问题