标准提供了有关移动构造函数的示例。有它说:
类
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(){ }
但是调用了复制构造函数。为什么?
答案 0 :(得分:2)
复制构造函数由以下行调用:
Y e = d;
这不能是移动操作,因为d
是左值。这就是您在输出中看到复制构造函数调用的原因。
对于第Y d(f(1))
行,d
从右移f(1)
(后来又从Y()
移出)移动,但copy elision表示这些移动构造函数的输出可能会被抑制。