考虑以下程序:
#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);
}
如果我运行程序,我会在GodBolt上看到结果:
ctor with value
ctor with value
move ctor
dtor
dtor
dtor
...这符合我的预期。然而,如果我在(*)
行上将析构函数标记为可能抛出异常,那么我会得到:这个结果:
ctor with value
ctor with value
copy ctor
dtor
dtor
dtor
...也就是说,复制构造函数被使用而不是移动构造函数。为什么会这样呢?看起来复制并没有防止移动所必需的销毁。
相关问题:
noexcept
说明符的情况有关的错误。这里的问题是关于带有noexcept
说明符的情况。因此我将重新打开。 - user17732522