这个问题看起来很奇怪,但我已经在多个编译器中检查过了。在我的代码中,我有一个移动构造函数
和一个拷贝构造函数
class A {
int val;
public:
A(int var) : val(var) {
}
A( A && a1) {
cout<<"M Value -> "<<a1.val<<endl;
cout<<"Move Cons..."<<endl;
}
A(const A & a1) {
cout<<"Copy Cons.."<<endl;
cout<<"Value -> "<<a1.val<<endl;
}
};
如果我将我的
main
函数写成这样:int main()
{
vector<A> v1;
A a2(200);
v1.push_back(move(a2));
}
输出结果为:
M Value -> 200
Move Cons...
预计会出现这种情况,但如果我将我的main
函数更改为
int main()
{
vector<A> v1;
A a2(200);
v1.push_back(A(100));
v1.push_back(move(a2));
}
我得到了以下输出。
M Value -> 100
Move Cons...
M Value -> 200
Move Cons...
Copy Cons.. // unexpected
Value -> 0 // unexpected
谁能帮助我理解这个复制构造函数
在哪里以及如何被调用,特别是当值为0
时。
谢谢
this->val
。当进一步移动或复制这样的对象时,您的程序会出现未定义行为,因为访问未初始化的对象。在您的情况下,val
中的不可预测值恰好为0。 - Igor Tandetnikstd::vector
标准库实现只有在它们包含的元素满足std::move_if_noexcept时才会在增长时移动元素,因为vector
需要实现强异常保证。如果它们无法移动,则会退回到复制。请将您的移动构造函数设置为noexcept
。 - Jesper Juhlv1.reserve(2);
。 - ks1322