C++嵌套对象成员函数调用失败:嵌套传参失效拆分调用正常是什么原因?
核心原因
你违反了C++的引用绑定规则:
something_else的第三个形参float& s_ref是非常量左值引用,这类引用只能绑定到有确定内存地址、可修改的左值上- 合并调用时传入的
item.something(prereq)是函数返回的临时值,属于右值,C++标准明确禁止非常量左值引用绑定到右值,因此编译失败 - 拆分写法时你把返回值存入了局部变量
s,s是合法左值,自然可以正常绑定到引用参数
不需要额外定义变量的解决方案
你不需要额外声明局部float变量即可实现合并调用,有两种可选方案:
方案1:修改为常量左值引用(推荐)
如果你不需要在something_else内部修改s_ref的值,把形参改为const float& s_ref即可,常量左值引用允许绑定到右值:
struct Stuff { float something (int& prereq) { float s = prereq+2; return s; } // 仅修改第三个参数为const引用 double something_else(int& prereq_ref, float& thing_ref, const float& s_ref ){ // 注意你原代码的s、thing、h都是未定义变量,需要先修正才能正常运行 double s2 = s_ref + thing_ref + prereq_ref; // 示例修正逻辑 return s2; } };
修改后你原来的合并调用写法即可正常编译运行。
方案2:修改为右值引用
如果你确实需要在something_else内部修改s_ref的值,可以把形参改为右值引用float&& s_ref,右值引用可以直接绑定临时对象:
// 仅修改第三个参数为右值引用 double something_else(int& prereq_ref, float& thing_ref, float&& s_ref ){ s_ref += 1; // 可以正常修改临时对象的值 double s2 = s_ref + thing_ref + prereq_ref; return s2; }
关于内存浪费的说明
即使你使用拆分写法,现代编译器开启优化选项后(比如-O2),这个仅做中转的局部float变量会被直接优化消除,不会产生任何额外的内存占用和性能损耗,不需要有这方面的顾虑。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

