我不明白为什么以下情况不起作用:
class X{
unsigned int sz;
public:
X(const unsigned int n = 0) : sz(n) {std::cout << "Default constructor called!" << std::endl;};
X(const X& x) : sz(x.sz) {};
X(X&& x) : sz(x.sz) {std::cout << "Move constructor called!" << std::endl;};
};
void foo(X&& x){
std::cout << x.size() << std::endl;
}
int main(){
X x(10);
foo(std::move(x));
foo(X(5));
return 0;
}
此程序打印:
默认构造函数!
默认构造函数叫做!
我知道移动构造函数在这个例子中没有意义,因为我们不会窃取任何东西,但是在这些情况下仍然不应该调用移动构造函数吗?
编辑:在Windows上使用g ++ 4.8.1。
答案 0 :(得分:1)
为什么呢?您只是将右值引用传递给函数,而不是创建新对象。
X x(10); // default constructor
foo(std::move(x)); // passing x as an rvalue
foo(X(5)); // creating an object (with the default constructor) which is passed as an rvalue
尝试X y(std::move(x))
,应调用移动构造函数。
只有在使用右值引用创建新对象时才会调用移动构造函数。