引用C中函数返回的向量元素

前端之家收集整理的这篇文章主要介绍了引用C中函数返回的向量元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人可以验证以下是BUG,并解释原因吗?我想我知道,但我不清楚细节. (我的实际问题涉及枚举的向量,而不是整数,但我认为它不重要.)假设我有以下代码
std::vector<int> f (void) {
  std::vector<int> v;
  v.push_back(5);
  return v;
}

void g (void) {
  const int &myIntRef = f()[0];
  std::cout << myIntRef << std::endl;
}

我是否正确myIntRef是一个悬空引用,因为f的返回值在堆栈中无处保存?

此外,以下是有效的修复,还是仍然是一个错误

const int myIntCopy = f()[0];  // copy,not a reference

换句话说,f()的返回结果是否可以在复制第0个元素之前抛弃?

解决方法

是的,确实做错了.你打电话的时候:
return v;

正在创建对象v的临时副本

const int &myIntRef = f()[0];

使用此临时副本的第一个元素初始化您的引用.在此行之后,临时副本不再存在,这意味着myIntRef是无效引用,使用该引用会产生未定义的行为.

你应该做的是:

std::vector<int> myVector = f();
const int &myIntRef = myVector[0];
std::cout << myIntRef << std::endl;

其中(感谢copy elision)使用赋值运算符通过使用v来初始化myVector对象,而不创建v的副本.在这种情况下,引用的生命周期等于myVector对象的生命周期,使其成为完全有效的代码.

还有你的第二个问题:

“Also,is the following a valid fix,or is it still a bug?”

06003

是的,这是另一种可能的解决方案. f()[0]将访问临时副本的第一个元素并使用其值初始化myIntCopy变量.保证f()返回的v副本至少存在,直到执行整个表达式,参见C 03标准12.2临时对象§3:

Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created.

猜你在找的C&C++相关文章