将引用分配给引用是一个有效的操作

Is assigning a reference to a reference a valid operation?

本文关键字:引用 一个 有效 操作 分配      更新时间:2023-10-16

我有以下代码:

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,它很高兴地做到了。一旦设置了本地引用,它将引用该对象,直到它的作用域结束,句号。如果你需要更改它所指的内容,那么你不需要引用,你需要一个指针。他们完全不同。