为什么有时不移动构造函数调用?测试移动语义(实时代码):
struct Test {
int id;
Test(int id) : id(id) {
cout << id << " Test() " << endl;
}
~Test() {
cout << id << " ~Test() " << endl;
}
Test(const Test &t) : id(t.id) {
cout << id << " Test(const Test &t) " << endl;
}
Test(Test &&t) : id(t.id) {
cout << id << " Test(Test &&t) " << endl;
}
Test &operator=(const Test &t) {
cout << id << " operator=(const Test &t) " << endl;
return *this;
}
Test &operator=(Test &&t) {
cout << id << " operator=(Test &&t) " << endl;
return *this;
}
};
void f(Test z) {
cout << z.id << " f(Test z) " << endl;
}
int main() {
f(Test(1));
Test t(2); f(t);
}
输出:
1 Test()
1 f(Test t) <---// where is move constructor ?!
1 ~Test()
2 Test()
2 Test(const Test &t) <---// copy constructor of t(2)
2 f(Test t)
2 ~Test()
2 ~Test()
测试显示复制构造函数被调用。
但是,在没有调用右值对象的移动构造f(Test(1));
函数的情况下调用函数之后。f
Test(1)
它是隐式编译器优化吗?还是我错过了重要的一点?