为什么不调用移动构造函数?

时间:2014-10-29 05:10:50

标签: c++

标准提供了有关移动构造函数的示例。有它说:

  

X的非模板构造函数是移动构造函数(如果是)   第一个参数的类型为X&&const X&&volatile X&&const   volatile X&&,要么没有其他参数,要么全部   其他参数有默认参数(8.3.6)。

我试图用Stadard提供的一个例子进行一些实验:

#include <iostream>
#include <limits>


struct Y {
    Y(){ std::cout << "Y()" << std::endl; };
    Y(const Y&){ std::cout << "Y(const Y&)" << std::endl; };
    Y(Y&&){ std::cout << "Y(const Y&&)" << std::endl; };
};

Y f(int)
{
    return Y();
}

Y d(f(1)); // calls Y(Y&&)
Y e = d; // calls Y(const Y&)

int main(){ }

DEMO

但是调用了复制构造函数。为什么?

1 个答案:

答案 0 :(得分:2)

复制构造函数由以下行调用:

Y e = d;

这不能是移动操作,因为d是左值。这就是您在输出中看到复制构造函数调用的原因。

对于第Y d(f(1))行,d从右移f(1)(后来又从Y()移出)移动,但copy elision表示这些移动构造函数的输出可能会被抑制。