首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我要用push_back而不是emplace_back呢?

为什么我要用push_back而不是emplace_back呢?
EN

Stack Overflow用户
提问于 2012-06-05 10:01:46
回答 4查看 68.6K关注 0票数 273

C++11向量具有新的函数emplace_back。与依赖编译器优化来避免复制的push_back不同,emplace_back使用完美转发将参数直接发送到构造函数,从而就地创建对象。在我看来,emplace_back做了push_back能做的所有事情,但有时它会做得更好(但从未变得更糟)。

我必须使用push_back的原因是什么

EN

回答 4

Stack Overflow用户

发布于 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 });将无法工作。

票数 126
EN

Stack Overflow用户

发布于 2012-06-05 10:03:21

向后兼容C++11之前的编译器。

票数 84
EN

Stack Overflow用户

发布于 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()的调用导致了硬崩溃。

票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10890653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档