auto在std::list中的奇葩现象

本文深入探讨了C++中复合模式的实现细节,特别是voidComposite::Feature()函数如何递归地调用子组件的Feature方法。通过对比两种不同的迭代器使用方式,揭示了auto关键字在迭代过程中的类型推导机制,帮助读者理解std::list<Component*>的正确遍历方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Composite::Feature()
{
	std::cout << m_name << " Feature: support!" << std::endl;
	std::list<Component*>::iterator iter = m_list.begin();
	for (; iter != m_list.end(); iter++)
	{
		(*iter)->Feature();
		std::cout << m_name << " iter: " << &(*iter) << std::endl;
		std::cout << m_name << " *iter: " << *iter << std::endl;
	}

	for (auto& iter1 : m_list)
	{
		//(*iter1)->Feature();	//error
		iter1->Feature();
		std::cout << m_name << " iter1: " << iter1 << std::endl;
	}
}

这里m_list的定义是std::list<Component*> m_list。
通过分别运行,可以看出这两个for的效果实际上是一样的,我原以为auto& iter1 : m_list中,iter1的类型应该是std::list<Component*>::iterator,然而事实却并非如此,在第二个for循环中使用(*iter1)->Feature()是编译不通过的。
我们可以通过在for循环中增加打印来分析一下,运行结果如下:
在这里插入图片描述
可以看出第一个for循环的(*iter)等效于第二个for循环的iter1,至于auto内部是怎么处理的,我们就不得而知了,只需要记住这个用法,小心使用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值