我在测试一个移动的构造,也做了以下内容:与移动构造函数问题
#include <iostream>
#include <string>
using namespace std;
class X{
public:
int* p;
int size;
X(){}
X(int n) : size(n){
p = new int[n];
for(int i = 0; i < n; i++)
p[i] = i;
cout << "Constructor\n";
}
~X(){
delete[] p;
}
X(const X& r){
cout << "Copy\n";
}
X(X&& r){
p = r.p;
size = r.size;
r.p = NULL;
r.size = 0;
cout << "Move\n";
}
};
int main() {
X a(10); //constructor
X b(a); // copy
X c(X(3)); //constructor, move
return 0;
}
我预计在输出中有什么意见,但在编译(VS 2012)移动构造函数时不叫?但是,如果我增加额外的参数的构造函数:
string name;
X(int n, string _name) : size(n), name(_name){
p = new int[n];
for(int i = 0; i < n; i++)
p[i] = i;
cout << "Constructor\n";
}
然后
X a(10, "a"); //constructor
X b(a); // copy
X c(X(3, "pom")); //constructor, move
我得到预期的结果...我真的不明白为什么。
编辑:现在测试的GCC 4.7.2,它不叫在这两种情况下,但C++ Builder中XE5编译器调用构造函数移动移动构造函数在这两种情况下。然而,VS只在第二种情况下才使用它(当使用额外的构造函数参数时)。非常有趣......
尝试使用['标准:: move'(http://en.cppreference.com/w/cpp /效用/移动)。 –
我知道std :: move,但是这并不能回答我的问题。 – Tracer
当然不会,否则我会写回答而不是评论。 :) –