[英]Why isn't move constructor called?
该标准提供了有关move构造函数的示例。 上面写着:
如果类
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(){ }
但是调用了拷贝构造函数。 为什么?
复制构造函数由以下行调用:
Y e = d;
这不能是移动操作,因为d
是一个左值。 这就是为什么在输出中看到复制构造函数调用的原因。
对于Y d(f(1))
, d
从右值f(1)
(后者又从Y()
移动),但是复制省略意味着这两个移动构造函数的输出可能是压抑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.