为何`node->getVoltage().isKnown = ...`表达式无法修改?
错误原因分析:expression must be a modifiable lvalue
问题的核心在于Node::getVoltage()的返回值类型:它默认返回的是VariableValue<float>的值拷贝,而不是原成员的引用。
当你调用node->getVoltage()时,程序会生成一个临时的VariableValue<float>对象(是原私有成员voltage的副本),这个临时对象属于右值——C++不允许直接修改右值的成员变量,所以执行node->getVoltage().isKnown = !node->getVoltage().isKnown;时,就会触发"expression must be a modifiable lvalue"错误。
而且退一步说,就算能修改,你两次调用getVoltage()得到的是两个完全独立的副本,修改第一个副本的isKnown,根本不会影响原Node对象里的voltage成员,完全达不到你想要的“切换原节点电压状态”的目的。
解决方法
修改Node类的getVoltage()函数,让它返回非const引用,这样调用时会直接指向原私有成员voltage,而非创建副本:
// Node类中的getVoltage函数修改为: VariableValue<float>& getVoltage() { return voltage; }
如果需要支持只读场景,可以再重载一个const版本的函数:
const VariableValue<float>& getVoltage() const { return voltage; }
修改后,node->getVoltage().isKnown = !node->getVoltage().isKnown;就会直接操作原Node对象的voltage成员,不会再触发错误。
内容的提问来源于stack exchange,提问作者Ryan Huynh
相关产品推荐
相关产品推荐

