为何删除了拷贝和移动构造函数的对象仍能传递给接受右值引用的函数?
你产生误解的核心原因是混淆了右值引用的绑定规则和移动/拷贝构造函数的触发条件。
std::move()的本质是类型转换,它只负责将左值转换为右值(将亡值)类型,本身不会触发任何构造、析构逻辑,也不会执行资源移动的实际操作。- 函数参数
Test&& thing是右值引用,本质是对传入对象的别名,和左值引用Test&一样,绑定过程不会产生新的Test对象,自然不需要调用拷贝构造或者移动构造函数。只要你传入的参数是右值(包括std::move转换后的右值),就可以完成绑定,所以即使你删除了拷贝和移动构造,这一步也不会报错。 - 只有当你使用值传递的方式定义函数(例如
void something(Test thing))时,才需要基于传入的参数构造新的thing对象,这时候传std::move(a)才会尝试调用移动构造函数,触发编译错误。
你观察到的运行结果也符合逻辑:由于thing是直接绑定到原对象a的右值引用,你在something内部通过thing修改的就是a本身,因此调用完something后a的成员x值变为44是预期行为。
内容的提问来源于stack exchange,提问作者bweber
相关产品推荐
相关产品推荐

