三元运算符为C++中返回的引用创建临时
Ternary operator creating temporaries for returned references in C++
为什么三元运算符在以下情况下为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;
}
相关文章:
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板