为什么三元运算符会为 a& 创建一个临时变量,以便在以下情况下引用:
SeqNo &fb(int x);
SeqNo &fc(int x);
SeqNo &a = cond ? fb(y):fc(y);
请注意,代码稍后会更新 a ,即
a= value;
无法更新fc()或fb()返回值引用的原始变量,因此 a 必须指向临时,同时将代码更改为
if( cond) {
SeqNo & a = fb(y);
a=value;
} else {
SeqNo &a = fc(y);
a=value;
}
正确更新fb()和fc()引用的原始变量。
注意fc()和fb()都返回相同类型的变量(& SeqNo),函数引用的变量是相同且相同的类型,即SeqNo。因此,不应对返回的引用进行转换。
我已经检查了堆栈溢出的重复项,但答案是针对何时的参数?返回可转换为单一类型或发生切片时的不同类型。在这种情况下,参数属于同一类型,并且不应对其中任何一个进行转换。
答案 0 :(得分:1)
SeqNo &fb(int x);
SeqNo &fc(int x);
SeqNo &a = cond ? fb(y):fc(y);
如果fb和fc返回的对象是在它们内部创建的,那么通过引用返回是没有意义的,因为该对象不存在于fb和fc的范围之外,因此您获得了无效的引用和风险意外的行为。
SeqNo &fb(int x)
{
SeqNo res;
...
return res;
}
正如我所说,执行fb后res不存在。
如果fb和fc返回的对象已经存在,例如作为静态变量,那么您将能够始终在同一个实例上工作
static SeqNo obj;
SeqNo &fb(int x)
{
//work on obj
...
return obj;
}