首页 > 解决方案 > 在 emplace() 中创建对象时复制省略

问题描述

我看到很多代码在工作中,人们将 emplace 和 emplace_back 与临时对象一起使用,如下所示:

struct A {
    A::A(int, int);
};

vector<A> v;
vector<A>.emplace_back(A(1, 2));

我知道 emplace_back 的重点是能够直接传递参数,如下所示:

v.emplace_back(1, 2);

但不幸的是,这对少数人来说并不清楚。但是,我们不要纠缠于此......

我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?

供您参考……我们正在使用 C++14。

标签: c++c++14copy-elision

解决方案


我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?

在一般情况下,它无法避免复制。由于emplace_back通过转发引用来接受,它必须从纯粹的标准角度创建临时对象。毕竟,这些引用必须绑定到对象。

复制省略是一组规则,允许避免复制(或移动)构造函数,并省略复制,即使构造函数和相应的析构函数有副作用。它仅适用于特定情况。通过引用传递参数不是其中之一。因此,对于非平凡的类型,对象副本不能被 as-if 规则内联,如果编译器的目标是符合标准,那么它的双手就会受到约束。


推荐阅读