在本地参考变量上工作
Working on a local reference variable
我期望以下代码导致不确定的行为:
#include <iostream>
#include <vector>
using namespace std;
template <class T>
void incrementElements(vector<T> &v)
{
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T& local = v[index];
++local;
}
}
int main(){
vector<int> v;
for(int i = 0; i < 10; ++i)
{
v.push_back(i);
cout << v[v.size() - 1] << endl;
}
incrementElements(v);
for(vector<int>::size_type index = 0; index < v.size(); ++index)
{
cout << v[index] << endl;
}
return 0;
}
我将我的向量元素引用到局部变量,然后将其递增。我希望,当本地变量的寿命结束时,向量的内存也将被清洁,从而导致空的参考。除了确实给出了正确的输出。
这是编译器足够聪明并修复此行为还是可以接受的编码方法?
我使用G (GCC)5.3.0
编译编辑
为了指定我的主要混乱,我错误地假设引用创建了某种硬性链接,这等同于如何声明原始变量。
在我目前的理解中,以下是使用指针相等的:
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T* local = &v[index];
++(*local);
}
要注意的几件事:
- 当您拥有UB时,该程序可以以任何方式行事,包括"正确"工作的可能性(即给出预期结果)
- 没有"空参考"之类的东西
您的代码本身很好,可以参考对象的引用不范围。在引用之前,请参考的对象出现在范围内(但请注意,在某些情况下,const引用延长对象的寿命),然后尝试通过参考尝试使用它。
您的代码很好。
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T& local = v[index];
++local;
}
类似于
int i = 0;
{
int& ref = i;
++ref; // Changes the value of i
}
最后,您希望看到i
的值为1。
-
ref
仅生活在嵌套范围中。它不能在嵌套范围之外使用。它不会改变i
的寿命。 -
i
的值通过ref
在嵌套范围内更改。嵌套范围结束后,i
继续活着。
相关文章:
- 将双精度值转换为 char 变量时字符串流如何工作
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- C++工作不统一,所有变量都定义
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 变量地址的运算符[]是如何工作的
- 可视化的c++变量赋值使代码正常工作
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- 返回对局部变量的引用是否正常工作?
- 访问其他线程堆栈变量如何在C++中工作?
- 为什么分配给gr_complex变量(GNU Radio)不再为我工作?
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正
- 为什么在CTOR工作中将温度变量传递到const Ref中
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 使用 swig 在 Python 中分段错误(核心转储),但当我更改变量名称时它可以工作
- 我对变量在递归函数中如何工作的理解是否正确?
- 为什么用未申报的变量工作调用函子
- 全局变量增量在 C++ 中的工作原理
- 使用未来wait_for时无法检查成员变量,但是如果我睡在线程中,它可以工作
- 带有双精度的变量无法正常工作
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法