C++将类成员变量传入接受右值引用参数的函数时编译报错的问题求助
C++将类成员变量传入接受右值引用参数的函数时编译报错的问题求助
嗨,我来帮你搞懂这个编译错误的原因和解决办法!
首先咱们先拆解一下问题:你代码里的m_something是MyClass的成员变量,它属于左值——简单说就是有固定名字、能被取地址的变量,C++里默认不会把左值自动转换成右值引用。而你的CallMethod函数参数是Something<float>&&,这是右值引用,它只能绑定到右值(比如临时创建的对象、即将被销毁的对象这类没有持久身份的东西),所以编译器才会报错说找不到匹配的函数,没法把左值转成右值引用。
那怎么解决呢?有两个常用的方案,你可以根据自己的需求选:
方案一:用
std::move()显式将左值转为右值引用
如果你确实想把m_something的资源转移给CallMethod处理,那就在调用函数的时候用std::move()包装一下成员变量,修改后的代码是这样的:void DoThisAndThat() { m_my_other_class.CallMethod(std::move(m_something)); }👉 注意:用了
std::move之后,m_something内部的资源就被“转移走”了,后续如果再访问这个成员变量,它的状态是未定义的(比如里面的data可能变成无效值),一定要谨慎使用!方案二:修改
CallMethod的参数类型为常量左值引用
如果你的CallMethod只是需要读取something的数据,不需要转移它的资源,那把参数改成const Something<float>&会更安全,这样不管是左值还是右值都能正常传入,而且不会破坏原对象的状态:void CallMethod(const Something<float>& something) { }这个方案没有任何副作用,是很多场景下的首选,除非你明确要做资源移动优化。
再给你贴一下修改后的完整示例代码(用方案一的情况):
template<typename T> class Something { public: T data; }; class MyOtherClass { public: void CallMethod(Something<float>&& something) { } }; class MyClass { public: void DoThisAndThat() { // 这里加上std::move m_my_other_class.CallMethod(std::move(m_something)); } MyOtherClass m_my_other_class; Something<float> m_something; };
内容来源于stack exchange
相关产品推荐
相关产品推荐

