三元运算符为C ++中返回的引用创建临时值

时间:2018-02-02 09:11:09

标签: c++ reference ternary

为什么三元运算符会为 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。因此,不应对返回的引用进行转换。

我已经检查了堆栈溢出的重复项,但答案是针对何时的参数?返回可转换为单一类型或发生切片时的不同类型。在这种情况下,参数属于同一类型,并且不应对其中任何一个进行转换。

1 个答案:

答案 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;
}