右值引用作为参数会调用移动构造吗?代码运行异常疑问
为什么移动构造函数未被调用?
你的代码里移动构造函数没触发,核心原因是**func的参数是右值引用类型A&&,传递右值/转换后的右值时只是引用绑定,不会触发对象的构造(包括移动构造)**。
我们逐行拆解main里的执行逻辑:
A a;:直接构造对象a,触发默认构造函数,输出第一次Default Constructor。func(std::move(a));:std::move(a)仅将左值a转换为右值引用类型,并未创建新的A对象。func的参数A&& a直接绑定到这个转换后的右值引用上,全程没有新对象初始化,自然不会调用移动构造函数。func(A());:A()会创建一个临时A对象,这个过程触发默认构造函数,输出第二次Default Constructor。随后这个临时对象作为右值,直接绑定到func的A&&参数上,同样没有新对象需要构造,因此也不会调用移动构造。
如果想要触发移动构造函数,需要在func内部用传入的右值引用初始化新的A对象,比如修改func为:
void func(A&& a) { A b = std::move(a); // 此处会调用移动构造函数 }
此时运行代码,输出就会包含Move Constructor了。
另外你提到“为了避免编译器优化而定义赋值运算符”,但当前场景和赋值逻辑无关,问题出在引用绑定的机制上,和编译器优化没有关系。
内容的提问来源于stack exchange,提问作者Danil Hu
相关产品推荐
相关产品推荐

