You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试Component类移动构造函数时,为何调用的是复制构造函数?

为什么我的移动构造函数没有被调用,反而调用了拷贝构造?

这是C++右值引用里一个非常容易踩的陷阱!核心原因一句话就能说清:拥有名字的右值引用本身是左值。

咱们拆解你的代码来看问题出在哪:

void f(Component&& c) {
    Component c2 = c; // 这里的c是左值!
}

虽然c的类型是Component&&(右值引用),但因为它有明确的变量名,在函数内部它会被当作左值处理——你可以对它取地址、重复使用它,这些都是左值的典型特征。而拷贝构造函数的参数是const Component&,左值可以完美绑定到这个引用上,所以编译器自然会选择拷贝构造,而非需要右值的移动构造。

解决方法

要让编译器调用移动构造,你需要把这个左值形式的右值引用再转换回右值,用std::move()就能搞定这件事:

void f(Component&& c) {
    Component c2 = std::move(c); // 现在会正确调用移动构造函数
}

std::move()的作用就是把左值强制转换成对应的右值引用,这样就完全匹配移动构造函数的参数类型Component&&了。

额外小提示

顺便提一下你的Component类里的一个潜在严重bug:
类的私有成员_data被声明为int _data;,但构造函数里你却用new int[_size]把它赋值成数组指针,拷贝构造里又换成了new uint8_t[_size]——这是明显的类型不匹配错误!_data应该被声明为int*(或者统一成uint8_t*),否则会导致未定义行为,建议先修正这个问题再测试移动语义。

内容的提问来源于stack exchange,提问作者klaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:05