移动构造函数不工作?

时间:2014-09-27 10:34:31

标签: c++ c++11 move-semantics

我不明白为什么以下情况不起作用:

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。

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)),应调用移动构造函数。

只有在使用右值引用创建新对象时才会调用移动构造函数。