C++静态局部变量引用疑问:为何foo1未随静态实例变更?
问题核心:
auto的默认推导是值类型,而非引用 你的问题和static特性无关,完全是对auto推导规则的误解。
代码运行逐行解析
先明确:Foo::Instance()返回的确实是静态实例的引用,但你用auto foo1 = ...接收时,auto默认会推导成Foo类型(值类型),所以foo1是静态实例的一份拷贝,不是引用。
第一行输出(1)
auto foo1 = Foo::Instance();- 调用
Instance()时,静态Foo instance被初始化(默认构造时a为0),随后执行instance.a +=1,a变为1。 auto推导为Foo,foo1是这个静态实例的拷贝,foo1.a等于1,输出1。
- 调用
第二行输出(1)
Foo::Instance().a += 1;- 再次调用
Instance(),静态实例的a先加1(从1变2),然后手动再加1,最终静态实例的a是3。 - 但
foo1是独立的拷贝,和静态实例无关联,所以foo1.a还是1,输出1。
- 再次调用
第三行输出(4)
auto foo2 = Foo::Instance();- 第三次调用
Instance(),静态实例的a(当前是3)加1变为4。 foo2是这个静态实例的拷贝,所以foo2.a等于4,输出4。
- 第三次调用
达到预期效果的修改方法
如果想让foo1成为静态实例的引用,需要显式让auto推导为引用类型,把代码改成:
auto& foo1 = Foo::Instance(); // 用auto&推导为引用类型
这样修改后,第二个cout就会输出3,因为foo1直接指向静态实例,静态实例的a变化会同步反映到foo1上。
内容的提问来源于stack exchange,提问作者nicFlower
相关产品推荐
相关产品推荐

