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

Ternary operator creating temporaries for returned references in C++

本文关键字:返回 引用 创建 C++ 三元 运算符      更新时间:2023-10-16

为什么三元运算符在以下情况下为a&创建一个临时变量来引用:

SeqNo &fb(int x);
SeqNo &fc(int x);
SeqNo &a = cond ? fb(y):fc(y);

请注意,代码稍后会更新,

a= value;

无法更新 fc() 或 fb() 返回值引用的原始变量,因此在将代码更改为

if( cond) {
SeqNo & a = fb(y);
a=value;
} else {
SeqNo &a = fc(y);
a=value;
}

正确更新 FB() 和 FC() 引用的原始变量。

注意 fc() 和 fb() 都返回相同类型的变量 (&SeqNo),并且函数引用的变量是相同且相同的类型,即 SeqNo。因此,不应对返回的引用进行转换。

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

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