将引用分配给引用是一个有效的操作
Is assigning a reference to a reference a valid operation?
我有以下代码:
void cStatisticDBSerializer::GetStats (std::map <std::string, long long >& ioCounterStats,
std::map <std::string, long long >& ioGaugeStats,
bool iSwitch)
{
// Before getting the stats, clear the containers
ioCounterStats.clear ();
ioGaugeStats.clear ();
std::map <std::string, long long >& lStats = ioCounterStats;
if (iSwitch)
{
lStats = ioGaugeStats;
}
// Do something with lStats
}
问题是:将函数输入引用分配给局部变量lStats是否有效?出于某种原因,这编译得很好,但行为并不像预期的那样。但是,如果我将lStats更改为指针,并按如下方式分配它(例如):
std::map <std::string, long long >* lpStats = &ioCounterStats;
它工作得很好。
有人能解释一下这里发生了什么吗。谢谢
一旦创建引用,就不能重新分配引用。相反,每次使用它都会"参考"原始作业。你的第一个例子相当于:
ioCounterStats /*lStats*/ = ioGaugeStats;
初始化后,您不能更改引用引用的容器,但您可以使用标志来控制它被初始化到哪个容器。如果您希望lSwitch标志来控制您引用的容器可以这样做:
void cStatisticDBSerializer::GetStats (std::map <std::string, long long >& ioCounterStats,
std::map <std::string, long long >& ioGaugeStats,
bool iSwitch)
{
// Before getting the stats, clear the containers
ioCounterStats.clear ();
ioGaugeStats.clear ();
std::map <std::string, long long >& lStats = iSwitch ? ioGaugeStats : ioCounterStats;
// Do something with lStats
}
如果iSwitch为true,则lStats将引用与ioGaugeStats相同的容器,如果为false,则lStats将引用ioCounterStats。
是的,它是完全有效的。然而,正如您所指出的,它并不总是如您所期望的那样。主要:参考文献不是指针。有一个比更大的区别。vs->。
正如您所指出的,指针指向对象的地址(或null),并且可以随时更改。
引用,总是指对特定对象的引用。您的代码接收一个对对象A
调用ioCounterStats
的引用,以及对对象B
调用ioGaugeStats
的引用。然后您使lStats
也参考了A
。然后你说if (iSwitch)
将B
分配给A
,它很高兴地做到了。一旦设置了本地引用,它将引用该对象,直到它的作用域结束,句号。如果你需要更改它所指的内容,那么你不需要引用,你需要一个指针。他们完全不同。
相关文章:
- 引用一个已擦除类型(void*)的指针
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 如何在C (转换Python代码)中引用一个函数
- C++11是否允许引用一个匿名的临时文件
- 你能取消引用一个整数文本吗
- 指针和引用:一个简单的例子
- 取消引用一个空指针数组
- 在C++中,如果我引用一个具有解除分配析构函数~MyClass的对象,那么超出范围的引用会调用析构函数吗
- 如何初始化boost::any并引用一个对象
- 我如何使一个函数指针引用一个局部变量
- 为什么我不需要解引用一个char指针来输出c风格的字符串?
- 如何引用一个静态函数作为参数传递
- 解引用一个超出边界50%的指针(数组的数组)
- 如何将Java中的开关替换为每个情况引用一个变量的列表?
- 试图引用一个被删除的函数
- 试图引用一个被删除的函数,VS 2015
- 我将如何引用一个自定义库与另一个库在c++
- 引用一个未命名的临时对象(生命周期)
- 为什么函数总是引用一个特定的参数
- "unresolved external symbol"从另一个类引用一个类