当前位置: 首页 > 知识库问答 >
问题:

当析构函数被标记为潜在抛出时,为什么std::向量使用复制构造函数而不是移动构造函数

养鸿运
2023-03-14

请考虑以下程序:

#include <vector>
#include <iostream>

class A {
    int x;
public:
    A(int n)          noexcept : x(n)       { std::cout << "ctor with value\n"; }
    A(const A& other) noexcept : x(other.x) { std::cout << "copy ctor\n"; }
    A(A&& other)      noexcept : x(other.x) { std::cout << "move ctor\n"; }
    ~A()                                    { std::cout << "dtor\n"; } // (*)
};

int main()
{
    std::vector<A> v;
    v.emplace_back(123);
    v.emplace_back(456);
}

如果我运行该程序,我会得到(GoBolt):

ctor with value
ctor with value
move ctor
dtor
dtor
dtor

...这符合我的预期。但是,如果在线(*)上我将析构函数标记为可能抛出,那么我得到:

ctor with value
ctor with value
copy ctor
dtor
dtor
dtor

...即使用复制因子代替移动因子。为什么会这样呢?复制似乎不能防止移动所必须的破坏。

相关问题:

    < li >是否要求std::vector使用移动而不是复制? < li >当向量增长时,如何实施移动语义? < li >向量重新分配使用复制而不是移动构造函数

暂时还没有答案

 类似资料:
  • 可能重复:< br >什么是复制省略和返回值优化? 我很难理解为什么在下面的代码中没有调用复制构造函数。 有人能解释一下为什么只调用构造函数,不调用复制构造函数吗?< br >谢谢。

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对

  • 问题内容: 我正在尝试使用来在我的Android应用中设置位置更新,但出现以下错误: LocationRequest构造函数被标记为内部,不应从应用程序访问 我的位置更新请求如下所示: 我遵循了docs和example,它们以相同的方式进行操作。如果不应该打电话给我,那么正确的方法是什么? 问题答案: 使用静态方法。

  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 在上面的代码中,执行以下语句时不调用复制构造函数: 既然返回是按值的,为什么不调用复制构造函数? 谢啦

  • 问题内容: Java为什么不支持C ++中的复制构造函数? 问题答案: Java。只是没有像在C ++中那样隐式地调用它们,我怀疑这是您的真正问题。 首先,复制构造函数无非是: 现在,C ++将使用以下语句隐式调用复制构造函数: 在这种情况下,克隆/复制在Java中根本没有意义,因为所有b1和b2都是引用,而不是像C 中那样的值对象。在C 中,该语句复制对象的状态。在Java中,它只是复制 引用