繁体   English   中英

为什么不调用move构造函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM